Agenda problemi con l' ordinamento

di il
12 risposte

Agenda problemi con l' ordinamento

Ciao ragazzi volevo far in modo che la stampa degli appuntamenti sia stampata in ordine e ho provato a creare un Selection Sort, ma manda in loop l' esecuzione, cosa ho sbagliato?' vi scrivo il codice

/*
  Name: Agenda Elettronica
  Copyright: 0124000773
  Author: Giacomo Gargiulo
  Description: Gestione di un agenda elettronica

Si vuole simulare la gestione di un’agenda elettronica contenente appuntamenti.
L’agenda è suddivisa in giorni, per 12 mesi complessivi. Ogni giorno è identificato
da 24 ore. Dato un mese, un giorno e un’ora permettere all’utente di:
• Inserire un appuntamento
• Disdire un appuntamento
Inoltre permettere all’utente di
• Data un’ora visualizzare tutti gli appuntamenti in un mese
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<ctype.h>
#define MAX_ORA 23
#define MAX_LUNGHEZZA_STRINGA 50
#define MAX_GIORNI 31
#define MAX_MESE 12
#define MAX_IMPEGNI 5
#define MAX_UTENTE 20
#define MAX_ANNO 2015

struct
{
  char Nome[MAX_UTENTE][MAX_LUNGHEZZA_STRINGA];
  char Cognome[MAX_UTENTE][MAX_LUNGHEZZA_STRINGA];
  int indice[MAX_UTENTE];
  int num_utenti;
  char Password[MAX_UTENTE][MAX_IMPEGNI];
}agenda;

struct
{
   int libero;
   int num_impegni;
   char description[MAX_IMPEGNI][MAX_LUNGHEZZA_STRINGA];
   int ora[MAX_IMPEGNI];
   int mese[MAX_IMPEGNI];
   int giorno[MAX_IMPEGNI];
   int anno[MAX_IMPEGNI];
}utente[MAX_UTENTE]; //facciamo un array di struct per ogni persona

void crea_agenda();
void inizializza();
int controllo_password(char [MAX_IMPEGNI]); // Riferimento per indirizzo del primo elemento dell' array che puo' essere visto come un puntatore
void visualizza();
void disdire();
void aggiorna();

void inizializza()
{
   int i,j;
   agenda.num_utenti=0;
   for(i=0;i<MAX_UTENTE;i++)
   {
      utente[i].libero=1;
      for(j=0;j<MAX_IMPEGNI;j++)
      {
        utente[i].ora[j]=-1;
      }
   }
}
void crea_agenda()
{

   int n_utente=0;
   int loop;
   int i,j;

   printf("Inserisci il numero di utenti da registrare:\t");
   do
   {
      loop=1;
      scanf("%d",&n_utente);
      fflush(stdin);
      if(n_utente+agenda.num_utenti > MAX_UTENTE)
      {
         printf("Non posso gestire tutti questi utenti! Ridefinire numeri di utenti:\a\t");
         loop=0;
      }
   }while(loop==0);

   agenda.num_utenti=agenda.num_utenti+n_utente;


   for(i=agenda.num_utenti-n_utente;i<agenda.num_utenti;i++)
   {
      printf("Inserire il proprio nome:\t");
      scanf("%s",&agenda.Nome[i]);
      printf("Inserire il proprio cognome:\t");
      scanf("%s",&agenda.Cognome[i]);
      do
      {
         printf("Inserire Password di almeno 4 caratteri:\t");
         scanf("%s",&agenda.Password[i]);
      }while(strlen(agenda.Password[i])>=MAX_IMPEGNI || controllo_password(agenda.Password[i])==1);

      do
      {
         agenda.indice[i]=rand()%MAX_UTENTE; //GESTIONE RANDOM DELLA POSIZIONE DEGLI UTENTI
      }while(utente[agenda.indice[i]].libero!=1);

      do
      {
         loop=1;
         printf("Definire il numero di impegni:\t");
         scanf("%d",&utente[agenda.indice[i]].num_impegni);
         fflush(stdin);
         if(utente[agenda.indice[i]].num_impegni > MAX_IMPEGNI)
         {
            printf("Troppi impegni, Rischi di collassare! Ridefinire impegni:\a\t");
            loop=0;
         }
      }while(loop == 0);

      for(j=0;j<utente[agenda.indice[i]].num_impegni;j++)
      {
         printf("Definire impegno %d.\n",j+1);
         do
         {
            printf("Inserisci l' ora in cui vuoi inserire l' impegno:\t");
            scanf("%d",&utente[agenda.indice[i]].ora[j]);
             fflush(stdin);
         }while(utente[agenda.indice[i]].ora[j] > MAX_ORA || utente[agenda.indice[i]].ora[j] < 0);
         do
         {
            printf("\nInserisci il giorno in cui vuoi inserire l' impegno:\t");
            scanf("%d",&utente[agenda.indice[i]].giorno[j]);
             fflush(stdin);
         }while((utente[agenda.indice[i]].giorno[j] > MAX_GIORNI) || (utente[agenda.indice[i]].giorno[j] <= 0));

         do
         {
            printf("\nInserisci l' anno in cui vuoi inserire l' impegno:\t");
            scanf("%d",&utente[agenda.indice[i]].anno[j]);
             fflush(stdin);
         }while(utente[agenda.indice[i]].anno[j] < MAX_ANNO);

         do
         {
            printf("\nInserisci il mese in cui vuoi inserire l' impegno:\t");
            scanf("%d",&utente[agenda.indice[i]].mese[j]);
            fflush(stdin);
         }while(utente[agenda.indice[i]].mese[j] > MAX_MESE || utente[agenda.indice[i]].mese[j] <= 0);

         printf("\nInserisci la descrizione del tuo impegno %d:\t",j+1);
         scanf("%s",&utente[agenda.indice[i]].description[j]);
         system("cls");
      }
   }
}
int controllo_password( char buffer[MAX_IMPEGNI]) //Passaimo il primo indirizzo dell' array mia_password
{
   int i;
   int count=0;
   for(i=0;i < agenda.num_utenti ;i++ )
   {
      if(!strcmp(buffer,agenda.Password[i]))
      {
         count++;
         if(count>1)
         {
            return 1;
         }
      }
   }
   return 0;
}
void visualizza()
{
   char mia_password[MAX_IMPEGNI];
   int i;

   printf("Inserire Password:\t");
   scanf("%s",&mia_password);
   for(i=0;i<agenda.num_utenti;i++)
   {
      if(!strcmp(mia_password,agenda.Password[i]))
      {
         int mia_ora,j,mio_mese,mio_giorno;
         printf("Inserci l' ora degli appuntamenti :\t");
         scanf("%d",&mia_ora);
         printf("Inserisci il mese dove cercare:\t");
         scanf("%d",&mio_mese);
         int count=0;
           
       //Selection Sort e stampa 
          do{
         	j=0;
            if((mia_ora==utente[agenda.indice[i]].ora[j]) && (mio_mese==utente[agenda.indice[i]].mese[j]))
            {
               int k;
               mio_giorno=utente[agenda.indice[i]].giorno[j];
               for(k=j+1;k<MAX_GIORNI;k++)
               {
               		if(utente[agenda.indice[i]].giorno[k] < mio_giorno)
               		{
               			mio_giorno=utente[agenda.indice[i]].giorno[k];
               			utente[agenda.indice[i]].giorno[k]=mio_giorno=utente[agenda.indice[i]].giorno[j];
               			mio_giorno=utente[agenda.indice[i]].giorno[j]=mio_giorno;
					}
			   }
               printf("Gli appuntamenti del mese %d del giorno %d dell ora %d sono :\n",mio_mese,mio_giorno,mia_ora);
               printf("Impegno %d Descrizione: %s\n",j+1,utente[agenda.indice[i]].description[j]);
               count++;
            }
            j++;
         }while(count<utente[agenda.indice[i]].num_impegni || j < MAX_GIORNI );
         break;
      }
   }
}

void disdire()
{
   char mia_password[MAX_IMPEGNI];
   int i;
   printf("Inserire Password:\t");
   scanf("%s",&mia_password);
   for(i=0;i<agenda.num_utenti;i++)
   {
      if(!strcmp(mia_password,agenda.Password[i]))
      {
         int mia_ora,j,mio_mese,mio_giorno,mio_anno;
         printf("Inserci l' ora dell' appuntamento da disdire :\t");
         scanf("%d",&mia_ora);
         printf("Inserire il giorno dell' appuntamento da disdire:\t");
         scanf("%d",&mio_giorno);
         printf("Inserisci il mese dove cercare:\t");
         scanf("%d",&mio_mese);
         printf("Inserisci l' anno:\t");
         scanf("%d",&mio_anno);
         for(j=0;j<utente[agenda.indice[i]].num_impegni;j++)
         {
            if(mia_ora==utente[agenda.indice[i]].ora[j] && mio_mese==utente[agenda.indice[i]].mese[j] && mio_anno==utente[agenda.indice[i]].anno[j] && mio_giorno==utente[agenda.indice[i]].giorno[j])
            {
               strcpy(utente[agenda.indice[i]].description[j],"DELETED");
               printf("\n");
               utente[agenda.indice[i]].ora[j]=utente[agenda.indice[i]].mese[j]=-1;
               utente[agenda.indice[i]].num_impegni--;
               printf("%s",utente[agenda.indice[i]].description[j]);
               break;
            }
         }
      break;
      }
   }
}

void aggiorna()
{

   int i,j;
   char mia_password[MAX_IMPEGNI];
   printf("Inserire Password:\t");
   scanf("%s",&mia_password);
   for(i=0;i<agenda.num_utenti;i++)
   {
      if(!strcmp(mia_password,agenda.Password[i]))
      {
         for(j=0;j<MAX_IMPEGNI;j++)
         {
           if(utente[agenda.indice[i]].ora[j]==-1)
           {
            printf("Definire impegno\n");
            do
            {
               printf("Inserisci l' ora in cui vuoi inserire l' impegno:\t");
               scanf("%d",&utente[agenda.indice[i]].ora[j]);
               fflush(stdin);
            }while(utente[agenda.indice[i]].ora[j] > MAX_ORA || utente[agenda.indice[i]].ora[j] < 0);
            do
            {
               printf("\nInserisci il giorno in cui vuoi inserire l' impegno:\t");
               scanf("%d",&utente[agenda.indice[i]].giorno[j]);
                fflush(stdin);
            }while((utente[agenda.indice[i]].giorno[j] > MAX_GIORNI) || (utente[agenda.indice[i]].giorno[j] <= 0));

            do
            {
               printf("\nInserisci l' anno in cui vuoi inserire l' impegno:\t");
               scanf("%d",&utente[agenda.indice[i]].anno[j]);
               fflush(stdin);
              
            }while(utente[agenda.indice[i]].anno[j] < MAX_ANNO);

            do
            {
               printf("\nInserisci il mese in cui vuoi inserire l' impegno:\t");
               scanf("%d",&utente[agenda.indice[i]].mese[j]);
                fflush(stdin);
            }while(utente[agenda.indice[i]].mese[j] > MAX_MESE || utente[agenda.indice[i]].mese[j] <= 0);

            printf("\nInserisci la descrizione del tuo impegno:\t");
            scanf("%s",&utente[agenda.indice[i]].description[j]);
            utente[agenda.indice[i]].num_impegni++;
            break;
           }
         }
        break;
      }
   }
}

int main()
{
   srand(time(NULL));
   char cosa_fare;
   int flag=0;
   inizializza();
   crea_agenda();
   while(flag==0)
   {

      printf("***********************************************\n");
      printf("* Benvenuto/a nella proria agenda elettronica *\n");
      printf("***********************************************\n");
      printf("Digitare la propria scelta\n");
      printf("'V' per Visualizzare un appuntamento\n");
      printf("'I' per Inserire un appuntamento\n");
      printf("'D' per Disdire un appuntamento\n");
      printf("'S' per Uscire dall'agenda elettronica\n");
      printf("Inserire la propria scelta:\t");

       cosa_fare= getchar();//Uso la funzione getchar per inserire i caratteri per la scelta dell'operazione da eseguire
       fflush(stdin);
       system("cls");
       if(cosa_fare == 'v' || cosa_fare == 'V')   //Utilizzo il costrutto di controllo if per gestire i vari casi di inseriemnto da parte dell' utente
       {
          visualizza();
       }
       if(cosa_fare == 'i' || cosa_fare == 'I')
       {
          aggiorna();
       }
       if(cosa_fare == 'D' || cosa_fare == 'd')
       {
          disdire();
       }
       if(cosa_fare == 'S' || cosa_fare == 's')
       {
           printf("Ciao e' stato un piacere esserti stato utile\n");
           flag=1;
       }
   system("pause");
   }
     return 0;
}

12 Risposte

  • Re: Agenda problemi con l' ordinamento

    Ad esempio, inserendo quali dati?
  • Re: Agenda problemi con l' ordinamento

    Ad esempio primo appuntamento alle ore 8 giorno 8 anno 2015 mese 8 appuntamento cpi
    secondo appuntamento alle ore 8 giorno 10 anno 2015 mese 8 appuntamento cox
    terzo appuntamento appuntamento alle ore 8 giorno 7 anno 2015 mese 8 appuntamento coda
  • Re: Agenda problemi con l' ordinamento

    Quando richiamo visualizza dovrebbe ordinare gli appuntamenti inseriti e stamparli in ordine di giorno
  • Re: Agenda problemi con l' ordinamento

    Il codice è contorto e confuso quindi non l'ho visto in dettaglio. Ti posso consigliare di controllare con una o più printf il valore degli elementi che includi nella condizione di uscita della while per capire perché non si conclude. Quando avrai ottenuto questi dati, dicceli e si vede qual è il problema
  • Re: Agenda problemi con l' ordinamento

    Supponiamo di inserire inizialmente per il primo appuntamento il giorno 8 per il mese 8 e l' ora 8,
    poi richiamo inserisci, e supponiamo di inserire il giorno 7 per il mese 8 e l' ora 8
    e poi richiamo ancora inserisci, e supponiamo di inserire il giorno 10, per il mese 8 e l' ora 8,
    il valore contenuto in utente[agenda.indice].giorno[j] , in utente[agenda.indice].giorno[k]
    e mio_giorno contengono 8, e non cambia, quindi quel va in loop -
  • Re: Agenda problemi con l' ordinamento

    Guarda ... ti assicuro che è impossibile risponderti se non riscrivendo tutto il codice.

    1) Dove comincia il sort e dove finisce?

    2) Quale array ordini?

    3) Qual è la chiave di ordinamento?

    Soprattutto, perché non utilizzi un banale "bubble sort" e dedichi una funzione apposita da chiamare quando ti serve?
  • Re: Agenda problemi con l' ordinamento

    
    void visualizza()
    {
       char mia_password[MAX_IMPEGNI];
       int i,j;
    
       printf("Inserire Password:\t");
       scanf("%s",&mia_password);
       for(i=0;i<agenda.num_utenti;i++)
       {
          if(!strcmp(mia_password,agenda.Password[i]))
          {
             int mia_ora,mio_mese,mio_giorno;
             printf("Inserci l' ora degli appuntamenti :\t");
             scanf("%d",&mia_ora);
             printf("Inserisci il mese dove cercare:\t");
             scanf("%d",&mio_mese);
             int count=0;
               
          	  //Selection Sort of min
              int k;
              printf("1 %d",utente[agenda.indice[i]].giorno[0]);
              printf("2 %d",utente[agenda.indice[i]].giorno[j]);
              for(j=0;j<MAX_GIORNI;j++)
              {
              		printf("3 %d",utente[agenda.indice[i]].giorno[j]);
              		mio_giorno=utente[agenda.indice[i]].giorno[j];
              		for(k=j+1;k<MAX_GIORNI;k++)
              		{
              			printf("4 %d",utente[agenda.indice[i]].giorno[k]);
              		 	if(utente[agenda.indice[i]].giorno[k] < mio_giorno)
    					{
    						mio_giorno=utente[agenda.indice[i]].giorno[k];
    						utente[agenda.indice[i]].giorno[j]=utente[agenda.indice[i]].giorno[k];
    						utente[agenda.indice[i]].giorno[j]=mio_giorno;
    					}	
    				}
    		  }
              do{
                	j=0;
                	if((mia_ora==utente[agenda.indice[i]].ora[j]) && (mio_mese==utente[agenda.indice[i]].mese[j]))
                	{
                   		mio_giorno=utente[agenda.indice[i]].giorno[j];
                   		printf("Gli appuntamenti del mese %d del giorno %d dell ora %d sono :\n",mio_mese,mio_giorno,mia_ora);
                   		printf("Impegno %d Descrizione: %s\n",j+1,utente[agenda.indice[i]].description[j]);
                   		count++;
                	}
                	j++;
             	}while(count < utente[agenda.indice[i]].num_impegni || j < MAX_GIORNI );
             break;
          }
       }
    }
    
    
    vorrei ordinare l' array giorno
  • Re: Agenda problemi con l' ordinamento

    Ma io ti ho fatto più domande ...
  • Re: Agenda problemi con l' ordinamento

    
    void visualizza()
    {
       char mia_password[MAX_IMPEGNI];
       int i,j;
    
       printf("Inserire Password:\t");
       scanf("%s",&mia_password);
       for(i=0;i<agenda.num_utenti;i++)
       {
          if(!strcmp(mia_password,agenda.Password[i]))
          {
             int mia_ora,mio_mese,mio_giorno;
             printf("Inserci l' ora degli appuntamenti :\t");
             scanf("%d",&mia_ora);
             printf("Inserisci il mese dove cercare:\t");
             scanf("%d",&mio_mese);
             int count=0;
               
          	  //Selection Sort of min
              selection_sort(i);
             j=0 // prima stava nel do e quindi giustamente creava un loop
              do{
                	if((mia_ora==utente[agenda.indice[i]].ora[j]) && (mio_mese==utente[agenda.indice[i]].mese[j]))
                	{
                   		mio_giorno=utente[agenda.indice[i]].giorno[j];
                   		printf("Gli appuntamenti del mese %d del giorno %d dell ora %d sono :\n",mio_mese,mio_giorno,mia_ora);
                   		printf("Impegno %d Descrizione: %s\n",j+1,utente[agenda.indice[i]].description[j]);
                   		count++;
                	}
                	j++;
             	}while(count < utente[agenda.indice[i]].num_impegni || j < MAX_GIORNI );
             break;
          }
       }
    }
    
    
    void selection_sort(int i)
    {
    	int k,j;
    	int mio_giorno;
        for(j=0;j<MAX_GIORNI;j++)
        {
            mio_giorno=utente[agenda.indice[i]].giorno[j];
            for(k=j+1;k<MAX_GIORNI;k++)
            {
              	if(utente[agenda.indice[i]].giorno[k] < mio_giorno)
    			{
    				mio_giorno=utente[agenda.indice[i]].giorno[k];
    				utente[agenda.indice[i]].giorno[j]=utente[agenda.indice[i]].giorno[k];
    				utente[agenda.indice[i]].giorno[j]=mio_giorno;
    			}	
    		}
    	}
    	
    }
    
    Ora dopo aver risolto il loop dando all' inizio un appuntamento in crea_agenda e due appntamenti in aggiorna, mi stampa un unico appuntmento dove mio_giorno assume valore 0 come valore
  • Re: Agenda problemi con l' ordinamento

    Cambio di problema
  • Re: Agenda problemi con l' ordinamento

    Ciao ragazzi ho risolto tutti i problemi che ho potuto, ma ora mi spiegate perchè ora non ordina?
    
    void visualizza()
    {
       char mia_password[MAX_IMPEGNI];
       int i,j;
    
       printf("Inserire Password:\t");
       scanf("%s",&mia_password);
       for(i=0;i<agenda.num_utenti;i++)
       {
          if(!strcmp(mia_password,agenda.Password[i]))
          {
             int mia_ora,mio_mese,mio_giorno;
             printf("Inserci l' ora degli appuntamenti :\t");
             scanf("%d",&mia_ora);
             printf("Inserisci il mese dove cercare:\t");
             scanf("%d",&mio_mese);
             int count=1;
               
          	  //Selection Sort of min
              j=0;
              do{
                	if((mia_ora==utente[agenda.indice[i]].ora[j]) && (mio_mese==utente[agenda.indice[i]].mese[j]))
                	{
                   		mio_giorno=utente[agenda.indice[i]].giorno[j];
              			selection_sort(i,mio_giorno);
                   		printf("Gli appuntamenti del mese %d del giorno %d dell ora %d sono :\n",mio_mese,mio_giorno,mia_ora);
                   		printf("Impegno %d Descrizione: %s\n",count,utente[agenda.indice[i]].description[j]);
                	}
                	j++;
                	count++;
             	}while(count < utente[agenda.indice[i]].num_impegni || j < MAX_GIORNI );
          }
       }
    }
    
    
    void selection_sort(int i,int mio_giorno)
    {
    	int k,j;
        for(j=0;j<MAX_GIORNI;j++)
        {
            mio_giorno=utente[agenda.indice[i]].giorno[j];
            for(k=j+1;k<MAX_GIORNI;k++)
            {
              	if(utente[agenda.indice[i]].giorno[k] < mio_giorno)
    			{
    				mio_giorno=utente[agenda.indice[i]].giorno[k];
    				utente[agenda.indice[i]].giorno[j]=utente[agenda.indice[i]].giorno[k];
    				utente[agenda.indice[i]].giorno[j]=mio_giorno;
    			}	
    		}
        }
    	
    }
    
  • Re: Agenda problemi con l' ordinamento

    Ciao ragazzi voglio tornare un passettino indietro, perchè se inserisco due appuntamenti, viene stampato un terzo dove giorno assume valore 2015 cioè quello che ho dato ad anno? come posso risolvere?
    
    void visualizza()
    {
       char mia_password[MAX_IMPEGNI];
       int i;
    
       printf("Inserire Password:\t");
       scanf("%s",&mia_password);
       for(i=0;i<agenda.num_utenti;i++)
       {
          if(!strcmp(mia_password,agenda.Password[i]))
          {
             int mia_ora,j,mio_mese;
             do
             {
    		 	printf("Inserci l' ora degli appuntamenti :\t");
             	scanf("%d",&mia_ora);
             	printf("Inserisci il mese dove cercare:\t");
             	scanf("%d",&mio_mese);
         	 }while(mia_ora < 0 && mia_ora > MAX_ORA && mio_mese < 0 && mio_mese > MAX_MESE);
             int count=1;
             	
    		 j=0;
             do{
                if((mia_ora==utente[agenda.indice[i]].ora[j]) && (mio_mese==utente[agenda.indice[i]].mese[j]))
                {
                   printf("Gli appuntamenti del mese %d del giorno %d dell ora %d sono :\n",mio_mese,utente[agenda.indice[i]].giorno[j],mia_ora);
                   printf("Impegno %d Descrizione: %s\n",count,utente[agenda.indice[i]].description[j]);
                   count++;
                }
                j++;
             }while(count<=utente[agenda.indice[i]].num_impegni || j < MAX_GIORNI );
             break;
          }
       }
    }
    
Devi accedere o registrarti per scrivere nel forum
12 risposte