Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Aiuto programma in C!!! Urgente!!

    Allora ho questo programma in C con File. Il programma crea 1 file trimestre.bin e da la possibilità di inserire modificare e cancellare utenti da una struct con vari campi( nome, cognome indirizzo ...) una volta effettuate le modifiche sulla struct deve salvare nel file trimestre.bin e questo lo fa però ho un problema nella cancellazione di 1 utente a scelta non capisco perchè inserisco 2 utenti e me ne visualizza solo 1 possibile da cancellare una mano!!!
    mi direste dove sbaglio?? Grazie in anticipo!!

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <windows.h>
    #define MAX 1000
    typedef struct {
    char nome[21];
    char cognome[21];
    char fiscale[17];
    char indirizzo[50]; // via ...
    float cFine_TriAttu; // lettura del contatore alla fine del trimestre attuale (metri cubi)
    float cFine_TriPrec; // lettura del contatore alla fine del trimestre precedente (metri cubi)
    float boll_Npag; // importo di eventuali bollette precedenti non pagate
    } Utente;
    int acquisisciStruct(Utente tab[]);
    int menu();
    int ricerca(Utente *v,int n,char key);
    void modifica(Utente t[],int n);
    void cancella(Utente u[],int n);
    int main() {
    int i,i2,z=0,lung3=0,lung;
    char nomekey[21];
    Utente tab2[MAX],tab3[MAX];
    FILE *f;
    int scelta,ret,true=1;
    do {
    scelta=menu();

    switch(scelta) {
    case 1:
    system("cls");
    lung=acquisisciStruct(tab2);
    printf("\n\n");
    system("pause");
    system("cls");
    break;
    case 2:
    //cancellazione 1 utente
    system("cls");

    fflush(stdin);
    //ret=ricerca(tab2,lung,nomekey);
    cancella(tab2,lung);


    fclose(f);
    system("pause");
    system("cls");
    break;
    case 3:
    system("cls");
    f=fopen("Trimestre.bin","w+b");
    fclose(f);
    printf("File Cancellato\n\n");
    system("pause");
    system("cls");
    break;
    case 4:
    //pagassetato
    system("C:/Users/Tommaso/Desktop/Programma FILE/gestacque/bin/Debug/pagassetato.exe");
    system("pause");
    system("cls");
    break;
    case 5:
    system("cls");
    printf("\n-----Modifica file-----\n");
    modifica(tab2,lung);
    system("pause");
    system("cls");
    break;
    case 6:
    system("cls");
    printf("\n (MODIFICHE TERMINATE)Carico File... \n\n\n");
    gotoXY(32,4);
    printf("|");
    gotoXY(1,4);
    printf("|");
    for(i=0; i<30; i++) {
    printf("%c",219);
    Sleep(150);
    }
    if((f=fopen("Trimestre.bin","rb"))==NULL) {
    f=fopen("Trimestre.bin","w+b");
    } else {
    f=fopen("Trimestre.bin","a+b");
    }
    for(i2=0; i2<lung; i2++) {
    fwrite(&tab2[i2],sizeof(Utente),1,f);
    }
    fclose(f);
    printf("\n\n File pronto\n\n");
    system("pause");
    system("cls");
    break;
    case 7:
    exit(1);
    break;
    }
    } while(1==1);

    }
    int acquisisciStruct(Utente tab[]) {
    int i,lung=0;
    char nuovo;
    FILE *f;
    memset(tab,0,sizeof(Utente)*MAX);
    for(i=0; i<MAX; i++) {
    lung+=1;
    printf("\n\tUTENTE %d",i+1);
    fflush(stdin);
    printf("\nInserisci nome: ");
    gets(tab[i].nome);
    fflush(stdin);
    printf("\nInserisci cognome: ");
    gets(tab[i].cognome);
    fflush(stdin);
    printf("\nCodice Fiscale: ");
    scanf("%s",tab[i].fiscale);
    fflush(stdin);
    printf("\nIndirizzo: ");
    gets(tab[i].indirizzo);
    fflush(stdin);
    printf("\nContatore fine trimestre attuale? ");
    scanf("%f",&tab[i].cFine_TriAttu);
    fflush(stdin);
    printf("\nContatore fine trimestre precedente? ");
    scanf("%f",&tab[i].cFine_TriPrec);
    fflush(stdin);
    printf("\nBollette precedenti non pagate: ");
    scanf("%f",&tab[i].boll_Npag);
    fflush(stdin);
    system("cls");
    printf("\nVuoi inserire un nuovo utente(s/n)?");
    scanf("%c",&nuovo);
    if(nuovo=='n') return 1;
    }
    return lung;

    }
    int menu() {
    int n;
    do {
    printf("\n\t--------MENU--------\n");
    printf("\n\t1-Inserisci utenti\n\n");
    printf("\t2-Cancellare utente\n\n");
    printf("\t3-Cancellare File\n\n");
    printf("\t4-Avvia PagaAssetato.exe\n\n");
    printf("\t5-Modifica Utente\n\n");
    printf("\t6-Salva nel File (ATTENZIONE!! SOLO SE E\' SICURO DI AVERE EFFETTUATO TUTTE LE MODIFICHE!!)\n\n");
    printf("\t7-ESCI\n\n");
    printf("\n\t scelta: ");
    scanf("%d",&n);
    } while(n<0 && n>7);
    return n;
    }
    int ricerca(Utente *v,int n,char key) {
    int i;
    for(i=0; i<n; i++) {
    if(strcmp(v[i].cognome,key)==0) {
    return i;
    }
    return -1;
    }
    }
    void modifica(Utente t[],int n) {
    int i;
    char mod[21];
    if(n>0) {
    fflush(stdin);
    printf("\nInserisci cognome dell\'utente da modificare");
    gets(mod);
    fflush(stdin);
    for(i=0; i<n; i++) {
    if(strcmp(t[i].cognome,mod)==0) {
    printf("\n\tUTENTE %d",i+1);
    fflush(stdin);
    printf("\nInserisci nome: ");
    gets(t[i].nome);
    fflush(stdin);
    printf("\nInserisci cognome: ");
    gets(t[i].cognome);
    fflush(stdin);
    printf("\nCodice Fiscale: ");
    scanf("%s",t[i].fiscale);
    fflush(stdin);
    printf("\nIndirizzo: ");
    gets(t[i].indirizzo);
    fflush(stdin);
    printf("\nContatore fine trimestre attuale? ");
    scanf("%f",&t[i].cFine_TriAttu);
    fflush(stdin);
    printf("\nContatore fine trimestre precedente? ");
    scanf("%f",&t[i].cFine_TriPrec);
    fflush(stdin);
    printf("\nBollette precedenti non pagate: ");
    scanf("%f",&t[i].boll_Npag);
    fflush(stdin);
    printf("\n Utente modificato");
    } else {
    printf("\nUtente Inesistente!!");
    }
    }
    } else printf("\n0 utenti inseriti!!!");
    }
    void cancella(Utente u[],int n) {
    int i,s,risp,rispostautente,k;

    do {
    printf("\tVuoi eliminare un utente?\n\n\tSi:Premi 1\n\tNo:Premi 2\nRisposta: ");
    scanf("%d",&risp);
    if(risp==1) {
    system("cls");
    for(s=0; s<n; s++) {
    printf("Utente %d\n",s+1);
    printf("%s\n",u[s].nome);
    printf("%s\n",u[s].cognome);
    printf("%s\n",u[s].fiscale);
    printf("%s\n",u[s].indirizzo);
    printf("%f\n",u[s].cFine_TriAttu);
    printf("%f\n",u[s].cFine_TriPrec);
    printf("%f\n",u[s].boll_Npag);
    }
    do {
    printf("Quale utente vuoi eliminare?\nDigita solo il numero:Utente ");
    scanf("%d",&rispostautente);
    if(rispostautente<=0||rispostautente>s) {
    printf("Utente non esistente\n");
    }
    } while(rispostautente<=0||rispostautente>s);
    for(k=rispostautente-1; k<n-1; k++) {
    strcpy(u[k].nome,u[k+1].nome);
    strcpy(u[k].cognome,u[k+1].cognome);
    strcpy(u[k].fiscale,u[k+1].fiscale);
    strcpy(u[k].indirizzo,u[k+1].indirizzo);
    u[k].cFine_TriAttu=u[k+1].cFine_TriAttu;
    u[k].cFine_TriPrec=u[k+1].cFine_TriPrec;
    u[k].boll_Npag=u[k+1].boll_Npag;

    }

    i--;
    }
    } while(risp==1);

    }
    void gotoXY(int x, int y) {
    COORD CursorPos = {x, y};
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hConsole, CursorPos);
    }

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    E' inutile che tu dica urgente, sarebbe più utile un titolo che esplichi il problema, comunque così il codice è illeggibile e "ho problemi nella cancellazione": quali di preciso?
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Utilizza i tag CODE altrimenti è impossibile rispondere.

    P.S. Scrivendo "urgente" peggiori la situazione ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Nella funzione cancella se ho inserito 2 utenti me ne visualizza 1 e me ne rende possibile da cancellare soltanto 1 !!! è questo il problema

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    codice:
    cancella(tab2,lung);
    Magari è sbagliata questa chiamata, anche perchè non si capisce da dove arrivi questo lung, come l'hai inizializzato?
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    codice:
    int i,lung=0; 
           char nuovo;
     FILE *f;
     memset(tab,0,sizeof(Utente)*MAX);
     for(i=0; i<MAX; i++) { 
          lung+=1; 
         printf("\n\tUTENTE %d",i+1); 
         fflush(stdin); printf("\nInserisci nome: "); 
         gets(tab[i].nome); 
         fflush(stdin); printf("\nInserisci cognome: "); 
         gets(tab[i].cognome);
         fflush(stdin); printf("\nCodice Fiscale: "); 
         scanf("%s",tab[i].fiscale); 
         fflush(stdin); 
         printf("\nIndirizzo: "); 
         gets(tab[i].indirizzo);
         fflush(stdin); 
         printf("\nContatore fine trimestre attuale? "); 
         scanf("%f",&tab[i].cFine_TriAttu); 
         fflush(stdin); 
         printf("\nContatore fine trimestre precedente? ");
         scanf("%f",&tab[i].cFine_TriPrec); 
         fflush(stdin);
         printf("\nBollette precedenti non pagate: "); 
         scanf("%f",&tab[i].boll_Npag); fflush(stdin); system("cls");
         printf("\nVuoi inserire un nuovo utente(s/n)?"); 
         scanf("%c",&nuovo);
         if(nuovo=='n') return 1;
        } return lung;
    lung è inizializzato qui e dovrebbe contare il numero di utenti inseriti se non ho sbagliato nulla cioè ogni volta chiede se si vuole inserirne uno nuovo ... se no fa break; e torna al menù

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Ki11aTom
    se no fa break; e torna al menù
    break ? Quale break ? Io vedo

    if(nuovo=='n') return 1;

    ovvero restituisce sempre 1

    Quindi vedrai sempre e solo un utente.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    ah è vero è return 1 ho sbagliato ma cambiando dovrebbe funzionare??

  9. #9
    Risolto funziona ora, era il return 1 che mandava in tilt tutto, apposto grazie per l'aiuto mi scuso su come ho postato il codice ma sono nuovo e non l'avevo mai fatto Grazie ancora

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Cambiandolo in modo corretto, sì.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.