Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2004
    Messaggi
    3

    [c]: problema della rubrica

    Salve a tutti ragazzi, ho implementato un algoritmo per il seguente problema. Verificatelo e fatemi sapere "ogni" eventuale imprecisione
    grazie, *ELY*

    Esercitazione 9: liste ordinate doppiamente concatenate

    Scrivere un algoritmo che simuli la gestione di un'agenda telefonica.
    Le specifiche del problema sono le seguenti:
    - Ciascun dato dell'agenda è costituito da un nome ed un numero di telefono
    - deve poter essere inserito un nuovo dato.
    - Un dato già inserito deve poter essere modificato.
    - i dati sono memorizzati in ordine alfabetico.
    - deve essere possibile visualizzare i dati dell'agenda singolarmente oppure simulando uno scrooling che opera in senso crescente e decrescente (così come avviene in un telefono cellulare)
    - I dati inizialmente devono essere letti da un file e in chiusura salvati sulo stesso file.

    Suggerimento: utilizzare un menù per gestire le varie operazioni
    Utilizzare una lista doppiamente concatenata per gestire i dati durante l'esecuzione del programma.

    Buon lavoro!.

    L'algoritmo da me implementato è il seguente:


    ------------------------------------------------
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define dim 35
    
    typedef struct nodo *node_pointer;
    typedef struct nodo {
                         char cognome[dim];
    		     char nome[dim];
                         char numero[dim];
                         node_pointer link_sx;
                         node_pointer link_dx;
                         } nodo;
    
    node_pointer davanti=NULL, dietro=NULL;
    int n;
    char str1[dim], str2[dim], str3[dim];
    
    void insert(node_pointer *, node_pointer *);
    void print(node_pointer);
    void modifica(node_pointer);
    void trova(node_pointer);
    void scorri(void);
    
    main()
    {
    int scelta=-1;
    FILE *fp;
    fp=fopen("rubr.txt", "r+");
    if(!fp)
    	{
       fclose(fp);
       fp=fopen("rubr.txt", "w");
       }
    else
    	{
       while(!feof(fp))
       	{
       	fscanf(fp, "%s %s %s ", str1, str2, str3);
          insert(&davanti, &dietro);
          }
       rewind(fp);
       }
    n=0;
    printf("\n\t\t\tRUBRICA\n");
    while(scelta)
    	{
       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: ");
       scanf("%d", &scelta);
       switch(scelta)
       	{
          case 1:  printf("\n\tNUOVO CONTATTO\n\n");
          			printf("\nInserisci cognome: ");
                   scanf("%s", str1);
                   printf("\nInserisci nome: ");
    					scanf("%s", str2);
                   printf("\nInserisci numero: ");
    					scanf("%s", str3);
          			insert(&davanti, &dietro);
          			break;
          case 2:  printf("\n\tMODIFICA CONTATTO\n\n");
          			modifica(davanti);
                   scelta=2;
          			break;
          case 3:  printf("\n\tVISUALIZZA UN CONTATTO\n\n");
          			trova(davanti);
          			break;
          case 4:  printf("\n\tSCORRI RUBRICA\n\n");
                   scorri();
                   scelta=4;
          			break;
          case 0:	break;
          default:	printf("\n\nScelta errata! Seleziona nuovamente la tua scelta\n");
          			scelta=-1;
                   break;
          }
       }
    while(!feof(fp) && davanti)
    	{
    	fprintf(fp, "%s %s %s\n", davanti->cognome, davanti->nome, davanti->numero);
       davanti=davanti->link_dx;
       }
    fclose(fp);
    fflush(stdin);
    getchar();
    }
    
    void insert(node_pointer *davanti, node_pointer *dietro)
    {
    node_pointer ptr, temp=(node_pointer)malloc(sizeof(nodo));
    if(!temp)
    	{
       printf("\nMEMORIA PIENA!");
       exit(1);
       }
    n++;
    strcpy(temp->cognome, str1);
    strcpy(temp->nome, str2);
    strcpy(temp->numero, str3);
    if(!*davanti)
    	{
       temp->link_sx=NULL;
       temp->link_dx=NULL;
       *davanti=temp;
       *dietro=temp;
       }
    else
    	if(strcmp((*davanti)->cognome, temp->cognome)>0)
       	{
          temp->link_sx=NULL;
          temp->link_dx=*davanti;
          (*davanti)->link_sx=temp;
          *davanti=temp;
          }
       else
       	{
       	ptr=*davanti;
          while(ptr->link_dx && (strcmp(ptr->link_dx->cognome, temp->cognome))<0)
          	ptr=ptr->link_dx;
          if(!ptr->link_dx)
          	{
             temp->link_sx=*dietro;
             temp->link_dx=NULL;
             (*dietro)->link_dx=temp;
             *dietro=temp;
             }
          else
          	{
             temp->link_sx=ptr;
             temp->link_dx=ptr->link_dx;
             ptr->link_dx=temp;
             }
    		}
    }
    
    void print(node_pointer ptr)
    {
    if(!ptr)
    	printf("\nRubrica vuota!");
    else
    	while(ptr)
       	{
          printf("\n%15s%15s%15s", ptr->cognome, ptr->nome, ptr->numero);
          ptr=ptr->link_dx;
          }
    }
    
    void modifica(node_pointer ptr)
    {
    char scegli;
    if(!ptr)
    	printf("\nRubrica vuota!");
    else
    	{
       printf("\nInserisci cognome: ");
       scanf("%s", str1);
       printf("\nInserisci nome: ");
       scanf("%s", str2);
       while(ptr && (strcmp(str1, ptr->cognome)!=0 || strcmp(str2, ptr->nome)!=0))
       	ptr=ptr->link_dx;
       if(!ptr)
       	printf("\nContatto assente!");
       else
       	{
          printf("\nContatto: %s %s %s\n", ptr->cognome, ptr->nome, ptr->numero);
          printf("\nVuoi modificare il cognome?(s/n) ");
          scanf("%1s", &scegli);
          if(scegli!='n')
          	{
             printf("\nInserisci nuovo cognome: ");
             scanf("%s", str1);
             strcpy(ptr->cognome, str1);
             }
          printf("\nVuoi modificare il nome?(s/n) ");
          scanf("%1s", &scegli);
          if(scegli!='n')
          	{
             printf("\nInserisci nuovo nome: ");
             scanf("%s", str1);
             strcpy(ptr->nome, str1);
             }
          printf("\nVuoi modificare numero?(s/n) ");
          scanf("%1s", &scegli);
          if(scegli!='n')
          	{
             printf("\nInserisci nuovo numero: ");
             scanf("%s", str1);
             strcpy(ptr->numero, str1);
             }
          }
       }
    }
    
    void trova(node_pointer ptr)
    {
    printf("\nInserisci cognome: ");
    scanf("%s", str1);
    printf("\nInserisci nome: ");
    scanf("%s", str2);
    while(ptr && (strcmp(str1, ptr->cognome)!=0 || strcmp(str2, ptr->nome)!=0))
    	ptr=ptr->link_dx;
    if(!ptr)
    	printf("\nContatto assente!");
    else
    	printf("\n%s %s %s", ptr->cognome, ptr->nome, ptr->numero);
    }
    
    void scorri(void)
    {
    char scegli;
    node_pointer ptr=davanti;
    while(scegli!='0')
       {
    	printf("\n%s %s %s\n\nVuoi andare al precedente(p) al successivo(s) o uscire(0)? ", ptr->cognome, ptr->nome, ptr->numero);
       scanf("%1s", &scegli);
       switch(scegli)
       	{
          case 'p':   if(ptr==davanti)
          					printf("\nNon ci sono contatti precedenti!");
          				else
                      	ptr=ptr->link_sx;
          				break;
          case 's':   if(ptr==dietro)
          					printf("\nNon ci sono contatti successivi!");
          				else
                      	ptr=ptr->link_dx;
          				break;
          case '0': 	break;
          default:    scegli='a';
          }
       }
    }

  2. #2
    Scrivere un algoritmo che simuli la gestione di un'agenda telefonica
    E il labirinto???? :master:



    Metti i tag '[CODE]'!
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2004
    Messaggi
    3
    opsssss... scusami che sbadata....
    Il labirinto non c'entrava niente!!!

  4. #4
    codice:
    fp=fopen("rubr.txt", "r+");
    if(!fp)
    	{
       fclose(fp);//<-----Non ci vuole
       fp=fopen("rubr.txt", "w");
       }
    else
    Ho già beccato un errore!Quella fclose non ci vuole (e infatti il prog crasha)perchè se fopen ritorna null (cioè se entri nell'if) non c'è nessun puntatore a file da rilasciare.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2004
    Messaggi
    3
    è vero.. non l'avevo notato, ke sbadata!

    Grazie

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 © 2025 vBulletin Solutions, Inc. All rights reserved.