Controllo e risoluzione di un progetto

di il
4 risposte

Controllo e risoluzione di un progetto

Ciao ho creato una rubrica telefonica, con le classiche cose: aggiungi contatto, cerca contatto e elimina contatto. però ho un piccolo problema, cioè ho inserito un GOTO e vorrei modificarlo sostituendolo con un do while. Mi potreste aiutare?
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<process.h>
#include<stdlib.h>
#include<dos.h>




struct contact
{
	long ph;
	char name[20],add[20],email[30];
}list;

char query[20],name[20];
FILE *fp, *ft;
int i,n,ch,l,found;

int main()
{




main:
system("cls");    //pulisco tutto e ristampo dopo
printf("\n\t ***** Benvenuto nella Rubrica *****");
printf("\n\n\n\t\tMenu principale\n\t\t=====================\n\t\t[1] Nuovo contatto\n\t\t[2] Lista contatti\n\t\t[3] Search for contact\n\t\t[4] Modifica contatto\n\t\t[5] Cancella contatto\n\t\t[0] Esci\n\t\t=================\n\t\t");
printf("Enter the choice:");
scanf("%d",&ch);

switch(ch)
{
case 0:
printf("\n\n\t\tSei sicuro di voler uscire?");
break;


/* *********************Nuovo contatto************  */
case 1:

system("cls");
fp=fopen("contact.dll","a");
for (;;)
{ fflush(stdin);
printf("Per uscire clicca spazio e invio :");
scanf("%[^\n]",&list.name);
if(stricmp(list.name,"")==0 || stricmp(list.name," ")==0)
break;
fflush(stdin);
printf("Phone:");
scanf("%ld",&list.ph);
fflush(stdin);
printf("address:");
scanf("%[^\n]",&list.add);
fflush(stdin);
printf("email address:");
fgets(list.email,30,stdin);
printf("\n");
fwrite(&list,sizeof(list),1,fp);
}
fclose(fp);
break;


/* *********************lista dei contatti*************************  */
case 2:
system("cls");
printf("\n\t\t================================\n\t\t\tLIST OF CONTACTS\n\t\t================================\n\nName\t\tPhone No\t    Address\t\tE-mail ad.\n=================================================================\n\n");

for(i=97;i<=122;i=i+1)
{

fp=fopen("contact.dll","r");
fflush(stdin);
found=0;
while(fread(&list,sizeof(list),1,fp)==1)
{
if(list.name[0]==i || list.name[0]==i-32)
{
printf("\nName\t: %s\nPhone\t: %ld\nAddress\t: %s\nEmail\t: %s\n",list.name,
list.ph,list.add,list.email);
found++;
}
}
if(found!=0)
{
    printf("=========================================================== [%c]-(%d)\n\n",i-32,found);
    getch();

}
fclose(fp);

}

break;



/* *******************cerco i contatti**********************  */ // magari lo tolgo
case 3:
system("cls");
do
{
found=0;
printf("\n\n\t..::CONTACT SEARCH\n\t===========================\n\t..::Name of contact to search: ");
fflush(stdin);
scanf("%[^\n]",&query);
l=strlen(query);
fp=fopen("contact.dll","r");

system("cls");
printf("\n\n..::Search result for '%s' \n===================================================\n",query);
while(fread(&list,sizeof(list),1,fp)==1)
{
for(i=0;i<=l;i++)
name[i]=list.name[i];
name[l]='\0';
if(stricmp(name,query)==0)
{
printf("\n..::Name\t: %s\n..::Phone\t: %ld\n..::Address\t: %s\n..::Email\t:%s\n",list.name,list.ph,list.add,list.email);
found++;
if (found%4==0)
{
printf("..::Press any key to continue...");
getch();
}
}
}

if(found==0)
printf("\n..::No match found!");
else
printf("\n..::%d match(s) found!",found);
fclose(fp);
printf("\n ..::Try again?\n\n\t[1] Yes\t\t[0] No\n\t");
scanf("%d",&ch);
}while(ch==1);
break;


/* *********************modifica contatti************************/
case 4:
system("cls");
fp=fopen("contact.dll","r");
ft=fopen("temp.dat","w");
fflush(stdin);
printf("..::Edit contact\n===============================\n\n\t..::Enter the name of contact to edit:");
scanf("%[^\n]",name);
while(fread(&list,sizeof(list),1,fp)==1)
{
if(stricmp(name,list.name)!=0)
fwrite(&list,sizeof(list),1,ft);
}
fflush(stdin);
printf("\n\n..::Editing '%s'\n\n",name);
printf("..::Name(Use identical):");
scanf("%[^\n]",&list.name);
fflush(stdin);
printf("..::Phone:");
scanf("%ld",&list.ph);
fflush(stdin);
printf("..::address:");
scanf("%[^\n]",&list.add);
fflush(stdin);
printf("..::email address:");
fgets(list.email,30,stdin);
printf("\n");
fwrite(&list,sizeof(list),1,ft);
fclose(fp);
fclose(ft);
remove("contact.dll");
rename("temp.dat","contact.dll");
break;




/* ********************cancello**********************/
case 5:
system("cls");
fflush(stdin);
printf("\n\n\t..::DELETE A CONTACT\n\t==========================\n\t..::Enter the name of contact to delete:");
scanf("%[^\n]",&name);
fp=fopen("contact.dll","r");
ft=fopen("temp.dat","w");
while(fread(&list,sizeof(list),1,fp)!=0)
if (stricmp(name,list.name)!=0)
fwrite(&list,sizeof(list),1,ft);
fclose(fp);
fclose(ft);
remove("contact.dll");
rename("temp.dat","contact.dll");
break;

default:
printf("Invalid choice");
break;
}


printf("\n\n\n..::Enter the Choice:\n\n\t[1] Main Menu\t\t[0] Exit\n");  //problema goto
scanf("%d",&ch);
switch (ch)
{
case 1:
goto main;  //non vuole goto


case 0:
break;

default:
printf("Invalid choice");
break;
}

return 0;
}

4 Risposte

  • Re: Controllo e risoluzione di un progetto

    Il 'goto' non e' il diavolo
    se usato con 'intelligenza', ci puo' anche stare.

    al momento il tuo codice e' cosi' "incasinato" che
    sostituirlo con qualcosa altro e' praticamente impossibile.

    In pratica, il problema non e' il goto, ma tutto il resto.

    la prima cosa da fare, oltre a formattare il codice secondo le regole del linguaggio C/C++, e' quello di riorganizzare il codice in modo piu' ordinato, usando le funzioni o la programmazione ad oggetti.
  • Re: Controllo e risoluzione di un progetto

    Hai fatto una porcheria con la tabulazione del codice, che non è un orpello ma ti serve proprio per risolvere i problemi come il tuo.
    Comunque
    
    main:
      while(1){
    
        [...]
    
        if(ch!=1)
          break;
      }
    
    return 0;
    }
    
  • Re: Controllo e risoluzione di un progetto

    ]Si sono consapevole della mia tabulazione ma è stato un errore di copiatura, come ho mezzo risolto usando un do do/while, ma mi sono accorto che nel caso 5 non riesco a far eliminare il contatto.
    
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<process.h>
    #include<stdlib.h>
    #include<dos.h>
    
    
    
    
    struct contact //struttura contact list
    {
    	long ph;
    	char name[20],add[20],email[30];
    }list;
    
    char query[20],name[20];
    FILE *fp, *ft;
    int i,n,ch,l,found;
    
    int main()
    {
    int i,n,ch,l,found;
    
    do{
    	system("cls");    //pulisco tutto e ristampo dopo
    	printf("\n\t ***** Benvenuto nella Rubrica *****");
    	printf("\n\n\n\t\tMenu principale\n\t\t=====================\n\t\t[1] Nuovo contatto\n\t\t[2] Lista contatti\n\t\t[3] Search for contact\n\t\t[4] Modifica contatto\n\t\t[5] Cancella contatto\n\t\t[0] Esci\n\t\t=================\n\t\t");
    	
    	printf("Seleziona una scelta:");
    	scanf("%d",&ch);
    	
    
    	switch(ch)
    	{
    		case 0:
    		printf("\n\n\t\tSei sicuro di voler uscire?");
    		break;
    		
    		
    		/* *********************Nuovo contatto************  */
    		case 1:
    		system("cls");
    		fp=fopen("contact.dll","a");
    		for (;;)
    		{ 
    			fflush(stdin);
    			printf("Nome:");
    			scanf("%[^\n]",&list.name);
    			if(stricmp(list.name,"")==0 || stricmp(list.name," ")==0)
    			break;
    			fflush(stdin);
    			printf("Numero:");
    			scanf("%ld",&list.ph);
    			fflush(stdin);
    			printf("Indirizzo:");
    			scanf("%[^\n]",&list.add);
    			fflush(stdin);
    			printf("email:");
    			fgets(list.email,30,stdin);
    			printf("\n");
    		}
    		fwrite(&list,sizeof(list),1,fp);
    		break;
    		
    		
    		/* *********************lista dei contatti*************************  */
    		case 2:
    		system("cls");
    		printf("\n\t\t================================\n\t\t\tLISTA DEI CONTATTI\n\t\t================================\n\nNome\t\tNumero\tIndirizzo\t\tE-mail ad.\n=================================================================\n\n");
    		
    		for(i=97;i<=122;i=i+1)
    		{
    			fp=fopen("contact.dll","r");
    			fflush(stdin);
    			found=0;
    			while(fread(&list,sizeof(list),1,fp)==1)
    			{
    				if(list.name[0]==i || list.name[0]==i-32)
    				{
    					printf("\nNome\t: %s\nNumero\t: %ld\nIndirizzo\t: %s\nEmail\t: %s\n",list.name,
    					list.ph,list.add,list.email);
    					found++;
    				}
    			}
    			if(found!=0)
    			{
    			    printf("=========================================================== [%c]-(%d)\n\n",i-32,found);
    			    getch();
    			
    			}
    			fclose(fp);
    		}
    		
    		break;
    		
    		
    		
    		/* *******************cerco i contatti**********************  */ // magari lo tolgo
    		case 3:
    		system("cls");
    		do
    		{
    			found=0;
    			printf("\n\n\t..::CERCA CONTATTI\n\t===========================\n\t..::Nome dei contatti che vuoi cercare: ");
    			fflush(stdin);
    			scanf("%[^\n]",&query);
    			l=strlen(query);
    			fp=fopen("contact.dll","r");
    			
    			system("cls");
    			printf("\n\n..::Risulato di '%s' \n===================================================\n",query);
    			while(fread(&list,sizeof(list),1,fp)==1)
    			{
    				for(i=0;i<=l;i++)
    				name[i]=list.name[i];
    				name[l]='\0';
    				if(stricmp(name,query)==0)
    				{
    					printf("\n..::Nome\t: %s\n..::Numero\t: %ld\n..::Indirizzo\t: %s\n..::Email\t:%s\n",list.name,list.ph,list.add,list.email);
    					found++;
    					if (found%4==0)
    					{
    						printf("..::Permi invio per continuare...");
    						getch();
    					}
    				}
    			}
    			
    			if(found==0)
    			{
    				printf("\n..::Nessun contatto/i trovato/i!");
    			}else
    			{
    				printf("\n..::%d contatto/i trovato/i!",found);
    				fclose(fp);
    				printf("\n ..::Cerca di nuovo\n\n\t[1] Yes\t\t[0] No\n\t");
    				scanf("%d",&ch);		
    			}
    		
    		}while(ch==1);
    		break;
    		
    		
    		/* *********************modifica contatti************************/
    		case 4:
    		system("cls");
    		fp=fopen("contact.dll","r");
    		ft=fopen("temp.dat","w");
    		fflush(stdin);
    		printf("..::Modifica contatto\n===============================\n\n\t..::Digita il nome del contatto che vuoi modificare:");
    		scanf("%[^\n]",name);
    		while(fread(&list,sizeof(list),1,fp)==1)
    		{
    			if(stricmp(name,list.name)!=0)
    			{
    				fwrite(&list,sizeof(list),1,ft);	
    			}
    		}
    		fflush(stdin);
    		printf("\n\n..::Editing '%s'\n\n",name);
    		printf("..::Nome:");
    		scanf("%[^\n]",&list.name);
    		fflush(stdin);
    		printf("..::Numero:");
    		scanf("%ld",&list.ph);
    		fflush(stdin);
    		printf("..::Indirizzo:");
    		scanf("%[^\n]",&list.add);
    		fflush(stdin);
    		printf("..::email:");
    		fgets(list.email,30,stdin);
    		printf("\n");
    		fwrite(&list,sizeof(list),1,ft);
    		fclose(fp);
    		fclose(ft);
    		remove("contact.dll");
    		rename("temp.dat","contact.dll");
    		break;
    		
    		
    		
    		
    		/* ********************cancello**********************/
    		case 5:
    		system("cls");
    		fflush(stdin);
    		printf("\n\n\t..::ELIMINA CONTATTO\n\t==========================\n\t..::Digita il nome del contatto che vuoi eliminare:");
    		scanf("%[^\n]",&name);
    		fp=fopen("contact.dll","r");
    		ft=fopen("temp.dat","w");
    		while(fread(&list,sizeof(list),1,fp)!=0)
    		if (stricmp(name,list.name)!=0)
    		{
    			fwrite(&list,sizeof(list),1,ft);
    			fclose(fp);
    			fclose(ft);
    			remove("contact.dll");
    			rename("temp.dat","contact.dll");	
    		}
    		break;
    		
    		default:
    		printf("Scelta non valida");
    		break;
    	}
    
    }while (ch != 5);
    return 0;
    }
    
    
  • Re: Controllo e risoluzione di un progetto

    Nel caso ch==5 esci dal programma con la condizione che hai messo. Ma non volevi uscire con zero? Come hai fatto a scrivere il resto se non hai chiare le condizioni di uscita da un while?
Devi accedere o registrarti per scrivere nel forum
4 risposte