Togliere il GOTO

di il
7 risposte

Togliere il GOTO

Salve a tutti, è il mio primo messaggio, e subito ho un problema da porvi... Ho una funzione main in cui devo togliere il GOTO chiaramente rendendo la main equivalente....e non sò come fare....

int main(void)
{
	int nRet = 0;

	char *szNomeFileIn = "Studenti.txt";
	char *szNomeFileOut = "StudentiOut.txt";
	int c;
	int NumRecords;

	Studenti *pStud, *pStudTemp;

	NumRecords = OttieniNumRecordsDaFileTesto(szNomeFileIn);
	if ( NumRecords <= 0 )
	{
		printf("Il file %s non contiene records.", szNomeFileIn);
		nRet = -1;
	}
	else
	{
		pStud = malloc(NumRecords * sizeof(Studenti));
		if(!pStud)
		{
			printf("Memoria insufficiente.\n");
			nRet = -1;
		}
		else
		{
			pStudTemp = malloc(NumRecords * sizeof(Studenti));
			if(!pStudTemp)
			{
				printf("Memoria insufficiente.\n");
				nRet = -1;
			}

			if ( !LeggiRecords(szNomeFileIn, pStud) )
			{
				printf("Errore nella lettura dei records.\n");
				nRet = -1;
			}

			while ( 1 )
			{
				if ( -1 == nRet )
					break;

				printf("\n\nInserisci una delle seguenti lettere:\n");
				printf("C -> ordina per Cognome\n");
				printf("M -> ordina per Matricola\n");
				printf("V -> ordina per Voto\n");
				printf("Una qualunque altra lettera per uscire.\n");
				printf("Scelta: ");
				fflush(stdin);
				c = getchar();

				mergesort(pStud, pStudTemp, 0, NumRecords-1, c);
				if ( !ScriviRecords(szNomeFileOut, pStud, NumRecords) )
				{
					printf("Errore nella scrittura dei records.\n");
					nRet = -1;
				}
				else
				{
					switch ( c )
					{
					case 'c':
					case 'C':
						printf("I records, ordinati per cognome, sono stati scritti nel file %s\n", szNomeFileOut);
						break;
					case 'm':
					case 'M':
						printf("I records, ordinati per matricola, sono stati scritti nel file %s\n", szNomeFileOut);
						break;
					case 'v':
					case 'V':
						printf("I records, ordinati per voto, sono stati scritti nel file %s\n", szNomeFileOut);
						break;
					default:
						goto esci;
						break;
					}
				}
			}
		}
	}

esci:

	if ( pStud )
		free(pStud);

	if ( pStudTemp )
		free(pStudTemp);
	
	return nRet;
}
GRAZIE MILLE

7 Risposte

  • Re: Togliere il GOTO

    Scrivi le operazioni in una funzione che viene chiamata in default e poi fuori cosi:
    
    
    void cancella(Studenti* pStud,Studenti* pStudTemp); //funzione che cancella
    
    int main(void)
    {
       int nRet = 0;
    
       char *szNomeFileIn = "Studenti.txt";
       char *szNomeFileOut = "StudentiOut.txt";
       int c;
       int NumRecords;
    
       Studenti *pStud, *pStudTemp;
    
       NumRecords = OttieniNumRecordsDaFileTesto(szNomeFileIn);
       if ( NumRecords <= 0 )
       {
          printf("Il file %s non contiene records.", szNomeFileIn);
          nRet = -1;
       }
       else
       {
          pStud = malloc(NumRecords * sizeof(Studenti));
          if(!pStud)
          {
             printf("Memoria insufficiente.\n");
             nRet = -1;
          }
          else
          {
             pStudTemp = malloc(NumRecords * sizeof(Studenti));
             if(!pStudTemp)
             {
                printf("Memoria insufficiente.\n");
                nRet = -1;
             }
    
             if ( !LeggiRecords(szNomeFileIn, pStud) )
             {
                printf("Errore nella lettura dei records.\n");
                nRet = -1;
             }
    
             while ( 1 )
             {
                if ( -1 == nRet )
                   break;
    
                printf("\n\nInserisci una delle seguenti lettere:\n");
                printf("C -> ordina per Cognome\n");
                printf("M -> ordina per Matricola\n");
                printf("V -> ordina per Voto\n");
                printf("Una qualunque altra lettera per uscire.\n");
                printf("Scelta: ");
                fflush(stdin);
                c = getchar();
    
                mergesort(pStud, pStudTemp, 0, NumRecords-1, c);
                if ( !ScriviRecords(szNomeFileOut, pStud, NumRecords) )
                {
                   printf("Errore nella scrittura dei records.\n");
                   nRet = -1;
                }
                else
                {
                   switch ( c )
                   {
                   case 'c':
                   case 'C':
                      printf("I records, ordinati per cognome, sono stati scritti nel file %s\n", szNomeFileOut);
                      break;
                   case 'm':
                   case 'M':
                      printf("I records, ordinati per matricola, sono stati scritti nel file %s\n", szNomeFileOut);
                      break;
                   case 'v':
                   case 'V':
                      printf("I records, ordinati per voto, sono stati scritti nel file %s\n", szNomeFileOut);
                      break;
                   default:
                      	  if (pStud && pStudTemp) cancella(pStud,pStudTemp);
    						return nret;
                   }
                }
             }
          }
    	  if (pStud && pStudTemp) cancella(pStud,pStudTemp);
    	  return nRet;
       }
    }
    
    
    //implementazione della funzione cancella
    void cancella(Studenti* pStud,Studenti* pStudTemp)
    {
      
          free(pStud);
          free(pStudTemp);
    }
    
    ciao.
  • Re: Togliere il GOTO

    Ma quindi devo aggiungere una funzione in più al programma? inserirla nelle dichiarazioni e poi definirla?
  • Re: Togliere il GOTO

    Una normale funzione che fa le operazioni che devi fare in quei casi e poi la chiami quando ti serve cioè in default del select case e come ultimo processo della main. Semplice.
  • Re: Togliere il GOTO

    È ma non riesco ad implemetare la funzione, prechè non ho ben capito come farla???
  • Re: Togliere il GOTO

    Guarda che la funzione te l'ho scritta nel sorgente che ti ho postato.

    void cancella(Studenti* pStud,Studenti* pStudTemp)
    {

    free(pStud);
    free(pStudTemp);
    }

    chiami questa funzione in default e come ultima istruzione della main così:
    if (pStud && pStudTemp) cancella(pStud,pStudTemp);
    return nRet;

    però non si tiene conto se uno dei due non esiste.
  • Re: Togliere il GOTO

    GRAZIE MILLE NON CI AVEVO FATTO CASO!
  • Re: Togliere il GOTO

    Oppure:


    int main(void)
    {
    int nRet = 0;

    char *szNomeFileIn = "Studenti.txt";
    char *szNomeFileOut = "StudentiOut.txt";
    int c;
    int NumRecords;

    Studenti *pStud, *pStudTemp;

    -->> boolean bOrdina=true;
    .....
    //while ( 1 )
    -->> while (bOrdina)
    {
    if ( -1 == nRet )
    break;

    printf("\n\nInserisci una delle seguenti lettere:\n");
    ......
    switch ( c )
    {
    ...
    default:
    -->> bOrdina=false;
    break;
    }
    }
    }
    }
    }
    ....

    ciao
    morena
Devi accedere o registrarti per scrivere nel forum
7 risposte