Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ -  Rubrica telefonica in c
Forum - C/C++ - Rubrica telefonica in c

Avatar
mimmo91 (Normal User)
Newbie


Messaggi: 3
Iscritto: 25/11/2011

Segnala al moderatore
Postato alle 18:22
Venerdì, 25/11/2011
salve,
vorrei implementare oltre a queste funzioni riportate nel codice, anche la funzione di cancellazione di un contatto dalla rubrica, quindi dal file.txt creato.
mi dareste una mano???

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define dim 35
  5.  
  6. typedef struct nodo *node_pointer;
  7. typedef struct nodo {
  8.                      char cognome[dim];
  9.                      char nome[dim];
  10.                      char numero[dim];
  11.                      node_pointer link_sx;
  12.                      node_pointer link_dx;
  13.                      } nodo;
  14.  
  15. node_pointer davanti=NULL, dietro=NULL;
  16. int n;
  17. char str1[dim], str2[dim], str3[dim];
  18.  
  19. void insert(node_pointer *, node_pointer *);
  20. void print(node_pointer);
  21. void modifica(node_pointer);
  22. void trova(node_pointer);
  23. void scorri(void);
  24.  
  25. main()
  26. {
  27. int scelta=-1;
  28. FILE *fp;
  29. fp=fopen("rubr.txt", "r+");
  30. if(!fp)
  31.         {
  32.    fp=fopen("rubr.txt", "w");
  33.    }
  34. else
  35.         {
  36.    while(!feof(fp))
  37.         {
  38.         fscanf(fp, "%s %s %s ", str1, str2, str3);
  39.       insert(&davanti, &dietro);
  40.       }
  41.    rewind(fp);
  42.    }
  43. n=0;
  44. printf("\n\t\t\tRUBRICA\n");
  45. while(scelta)
  46.         {
  47.    printf("\n\n\n\t(1)\tInserisci nuovo contatto\n\t(2)\tModifica contatto\n\t(3)\tVisualizza contatto singolo\n\t(4)\tScorri rubrica\n\t(0)\tEsci dal programma\n\nSeleziona la tua scelta: ");
  48.    scanf("%d", &scelta);
  49.    switch(scelta)
  50.         {
  51.       case 1:  printf("\n\tNUOVO CONTATTO\n\n");
  52.                         printf("\nInserisci cognome: ");
  53.                scanf("%s", str1);
  54.                printf("\nInserisci nome: ");
  55.                                         scanf("%s", str2);
  56.                printf("\nInserisci numero: ");
  57.                                         scanf("%s", str3);
  58.                         insert(&davanti, &dietro);
  59.                         break;
  60.       case 2:  printf("\n\tMODIFICA CONTATTO\n\n");
  61.                         modifica(davanti);
  62.                scelta=2;
  63.                         break;
  64.       case 3:  printf("\n\tVISUALIZZA UN CONTATTO\n\n");
  65.                         trova(davanti);
  66.                         break;
  67.       case 4:  printf("\n\tSCORRI RUBRICA\n\n");
  68.                scorri();
  69.                scelta=4;
  70.                         break;
  71.       case 0:   break;
  72.       default:  printf("\n\nScelta errata! Seleziona nuovamente la tua scelta\n");
  73.                         scelta=-1;
  74.                break;
  75.       }
  76.    }
  77. while(!feof(fp) && davanti)
  78.         {
  79.         fprintf(fp, "%s %s %s\n", davanti->cognome, davanti->nome, davanti->numero);
  80.    davanti=davanti->link_dx;
  81.    }
  82. fclose(fp);
  83. fflush(stdin);
  84. getchar();
  85. }
  86.  
  87. void insert(node_pointer *davanti, node_pointer *dietro)
  88. {
  89. node_pointer ptr, temp=(node_pointer)malloc(sizeof(nodo));
  90. if(!temp)
  91.         {
  92.    printf("\nMEMORIA PIENA!");
  93.    exit(1);
  94.    }
  95. n++;
  96. strcpy(temp->cognome, str1);
  97. strcpy(temp->nome, str2);
  98. strcpy(temp->numero, str3);
  99. if(!*davanti)
  100.         {
  101.    temp->link_sx=NULL;
  102.    temp->link_dx=NULL;
  103.    *davanti=temp;
  104.    *dietro=temp;
  105.    }
  106. else
  107.         if(strcmp((*davanti)->cognome, temp->cognome)>0)
  108.         {
  109.       temp->link_sx=NULL;
  110.       temp->link_dx=*davanti;
  111.       (*davanti)->link_sx=temp;
  112.       *davanti=temp;
  113.       }
  114.    else
  115.         {
  116.         ptr=*davanti;
  117.       while(ptr->link_dx && (strcmp(ptr->link_dx->cognome, temp->cognome))<0)
  118.         ptr=ptr->link_dx;
  119.       if(!ptr->link_dx)
  120.         {
  121.          temp->link_sx=*dietro;
  122.          temp->link_dx=NULL;
  123.          (*dietro)->link_dx=temp;
  124.          *dietro=temp;
  125.          }
  126.       else
  127.         {
  128.          temp->link_sx=ptr;
  129.          temp->link_dx=ptr->link_dx;
  130.          ptr->link_dx=temp;
  131.          }
  132.                 }
  133. }
  134.  
  135. void print(node_pointer ptr)
  136. {
  137. if(!ptr)
  138.         printf("\nRubrica vuota!");
  139. else
  140.         while(ptr)
  141.         {
  142.       printf("\n%15s%15s%15s", ptr->cognome, ptr->nome, ptr->numero);
  143.       ptr=ptr->link_dx;
  144.       }
  145. }
  146.  
  147. void modifica(node_pointer ptr)
  148. {
  149. char scegli;
  150. if(!ptr)
  151.         printf("\nRubrica vuota!");
  152. else
  153.         {
  154.    printf("\nInserisci cognome: ");
  155.    scanf("%s", str1);
  156.    printf("\nInserisci nome: ");
  157.    scanf("%s", str2);
  158.    while(ptr && (strcmp(str1, ptr->cognome)!=0 || strcmp(str2, ptr->nome)!=0))
  159.         ptr=ptr->link_dx;
  160.    if(!ptr)
  161.         printf("\nContatto assente!");
  162.    else
  163.         {
  164.       printf("\nContatto: %s %s %s\n", ptr->cognome, ptr->nome, ptr->numero);
  165.       printf("\nVuoi modificare il cognome?(s/n) ");
  166.       scanf("%1s", &scegli);
  167.       if(scegli!='n')
  168.         {
  169.          printf("\nInserisci nuovo cognome: ");
  170.          scanf("%s", str1);
  171.          strcpy(ptr->cognome, str1);
  172.          }
  173.       printf("\nVuoi modificare il nome?(s/n) ");
  174.       scanf("%1s", &scegli);
  175.       if(scegli!='n')
  176.         {
  177.          printf("\nInserisci nuovo nome: ");
  178.          scanf("%s", str1);
  179.          strcpy(ptr->nome, str1);
  180.          }
  181.       printf("\nVuoi modificare numero?(s/n) ");
  182.       scanf("%1s", &scegli);
  183.       if(scegli!='n')
  184.         {
  185.          printf("\nInserisci nuovo numero: ");
  186.          scanf("%s", str1);
  187.          strcpy(ptr->numero, str1);
  188.          }
  189.       }
  190.    }
  191. }
  192.  
  193. void trova(node_pointer ptr)
  194. {
  195. printf("\nInserisci cognome: ");
  196. scanf("%s", str1);
  197. printf("\nInserisci nome: ");
  198. scanf("%s", str2);
  199. while(ptr && (strcmp(str1, ptr->cognome)!=0 || strcmp(str2, ptr->nome)!=0))
  200.         ptr=ptr->link_dx;
  201. if(!ptr)
  202.         printf("\nContatto assente!");
  203. else
  204.         printf("\n%s %s %s", ptr->cognome, ptr->nome, ptr->numero);
  205. }
  206.  
  207. void scorri(void)
  208. {
  209. char scegli;
  210. node_pointer ptr=davanti;
  211. while(scegli!='0')
  212.    {
  213.         printf("\n%s %s %s\n\nVuoi andare al precedente(p) al successivo(s) o uscire(0)? ", ptr->cognome, ptr->nome, ptr->numero);
  214.    scanf("%1s", &scegli);
  215.    switch(scegli)
  216.         {
  217.       case 'p':   if(ptr==davanti)
  218.                                         printf("\nNon ci sono contatti precedenti!");
  219.                                 else
  220.                         ptr=ptr->link_sx;
  221.                                 break;
  222.       case 's':   if(ptr==dietro)
  223.                                         printf("\nNon ci sono contatti successivi!");
  224.                                 else
  225.                         ptr=ptr->link_dx;
  226.                                 break;
  227.       case '0':         break;
  228.       default:    scegli='a';
  229.       }
  230.    }
  231. }


PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 18:47
Venerdì, 25/11/2011
Salve,

non credo che sia possibile eliminare una riga da un file di testo;
cosi' su due piedi mi vengono in mente due soluzioni:

1) quando devi cancellare un contatto, semplicemente trascrivi tutti gli altri in un file temporaneo, poi cancelli l'originale, e rinomini il file temporaneo;

2) nel caso laprocedura 1 fosse troppo onerosa (se nella rubrica ci sono parecchi contatti) prova cosi'; quando devi cancellare un contatto semplicemente lo modifichi per "marcarlo" in modo che risulti cancellato, poi puoi usare la procedura 1 saltuariamente per pulire la rubrica dalle righe cancellate, oppure prevedere la possibilita', all'atto di nuovi inserimenti, di riutilizzare le righe marcate.

Solo una curiosita' perche' usi un file di testo quando sarebbe parecchio piu' comodo usare un file di dati?

Ciao. :k:


Le cose si fanno per bene o non si fanno affatto
PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 435
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 19:13
Venerdì, 25/11/2011
quoto la prima soluzione ovvero
1) apri il file in lettura
2) crei la lista escludendo il record che vuoi eliminare
3) close(file)
4) apri il file il modalita scrittura (W) in tal modo da eliminare il contenuto
5) scrivi la lista sul file


Bonny
PM Quote
Avatar
mimmo91 (Normal User)
Newbie


Messaggi: 3
Iscritto: 25/11/2011

Segnala al moderatore
Postato alle 19:23
Venerdì, 25/11/2011
per gigisoft non utilizzo un file di dati perchè questo è un esame che devo fare per l'università, e il prof ci ha imposto di usare un file di testo.
grazie ad entrambi :)
se non disturbo mi potete fare un esempio pratico della prima soluzione? grazie mille :)

PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 435
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 19:29
Venerdì, 25/11/2011
Dai mimmo91 !!!!!
ho scritto passo passo quello che devi fare non sembra cosi difficile:yup:

ti posto questo mio sorgente trovi tutto quello che ti serve
studia la tecnica che ho addoperato non fare copy&paste:(:(

http://www.pierotofy.it/pages/sorgenti/dettagli/18720-Gest ...


Bonny
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 19:48
Venerdì, 25/11/2011
Allora, praticamente:

1) apri il file in lettura
e gia' lo fai

2) trascrivi ogni contatto dal file origine in uno di appoggio
si tratta, per ogni contatto, di leggerlo da un file e inserirlo in coda a un altro, e gia' lo fai

3) chiudi il file origine e lo cancelli
e gia' lo sai fare (spero, se no ristudiati la gestione dei file ;) )

4) Rinomina il file di appoggio col nome che aveva il file originale
e gia' lo sai fare (spero, se no, ti rimando al consiglio del punto 3)

combina il tutto in una functio e il gioco e' fatto.

Ciao. :k:


Le cose si fanno per bene o non si fanno affatto
PM Quote
Avatar
mimmo91 (Normal User)
Newbie


Messaggi: 3
Iscritto: 25/11/2011

Segnala al moderatore
Postato alle 11:32
Sabato, 26/11/2011
grazie ancora ad entambi :)
tranquillo studierò tutto per bene sennò il prof mi boccia ;)

Ultima modifica effettuata da mimmo91 il 26/11/2011 alle 11:32
PM Quote