Problema while in C

di il
8 risposte

Problema while in C

Ciao a tutti. Da poco mi sono avvicinato al linguaggio C e vorrei avere un aiuto riguardo ad esso. Ho scritto un programma che prende in input due vettori A e B di int e verifica se la sequenza di numeri in B è contenuta in A. Ho usato i puntatori per memorizzare i vettori.

L'idea della funzione controllo() era di confrontare A[a+b] con B[a] con a e b inizialmente 0. Parto con b=0 e incremento a. Nell'incrementare, appena vedo che all' a-esimo passo A[a+0] è diverso da B[a] mi fermo e pongo b=1 e rinizio ad incrementare a partendo da a=0. (a lo incremento fino a VN2 che è la lunghezza del vettore).

Ho usato più while, però dopo aver inserito i vettori, credo mi entri in un loop perchè non stampa a schermo nulla. Per come ho capito gli while prima dovrebbe lavorare su quelli più interni e poi su quelli più esterni. Correggetemi se sbaglio. Ci sono anche degli if else. Potrbbe essere lì il problema?
Grazie.

Questo è il programma:
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0

int controllo(int *V1,int *V2,int VN1,int VN2, int *ptrfound);

int main(int *A1, int *A2, int N1, int N2)
{
       
      int count;
      int found;
     
      
      printf("Inserisci lunghezza A1");
      scanf("%d",&N1);
      printf("Inserisci lunghezza A2");
      scanf("%d",&N2);
      
      A1=(int *)malloc(N1*sizeof(int));
      A2=(int *)malloc(N2*sizeof(int));
      
      if(N2>N1) {printf("Impossibile verificare. Lunghezza di A2 maggiore di A1");
                 found=FALSE;
                 system("PAUSE");
                 return found;}
      else{     
                printf("Inserisci il vettore A1");
                for(count=0;count<N1;count++)
                {
                 scanf("%d",&A1[count]);}
                printf("Inserisci il vettore A2"); 
                for(count=0;count<N2;count++)
                {
                 scanf("%d",&A2[count]);}
          }
          
controllo(A1,A2,N1,N2,&found);

system("PAUSE");
return found;
}

int controllo(int *V1,int *V2,int VN1,int VN2, int *ptrfound)
{
     int blocco;
     int found;
     int esci;
     int a;
     int b;
     a=0;
     b=0;
     blocco=FALSE;
     esci=FALSE;

     while((b<=(VN1-VN2)) && (esci==FALSE))        
          { 
            while((a<VN2) && (blocco==FALSE))
                 {
                   while(V1[a+b]!=V2[a])
                      { a=a++; 
                        if(a=VN2-1){printf("Ok, fine");
                               *ptrfound=TRUE;
                               return *ptrfound;}
                      }
                  blocco=TRUE;
                  
                 }
            if(blocco==TRUE)
              
              {
                 a=0;
                 b=b++;
              }
            else
                 esci=TRUE;
          }              
                 
     if(blocco==FALSE)
       
          { 
            printf("Ok");
            *ptrfound=TRUE;
            return *ptrfound;
          }   
          
     
     else
          printf("No");
          
}

8 Risposte

  • Re: Problema while in C

    Fatti capire. Tu vuoi che tutti i numeri di B siano compresi in A in ordine sparso o nell'ordine di posizionamento in B? Cioè vuoi verificare che A contiene gli elementi di B in qualsiasi ordine o vuoi che B sia un sottovettore di A?

    Modifica anche il main. Il main ha una struttura ben definita che può essere di due tipi:
    
    int main(void);
    
    oppure
    
    int main(int argc, char * argv);
    
  • Re: Problema while in C

    Si scusa non avevo specificato. Voglio che i numeri in B siano compresi in A nell'ordine di posizionamento in B, cioè un sottovettore.

    Riguardo al main deve avere sempre quei due tipi di strutture? Scusa ma non sono molto esperto. Comunque nel mio caso potrei scegliere
    int main(void)
    e dichiarare all'interno del main i puntatori e le variabili che prima erano tra le parentesi tonde del main.
  • Re: Problema while in C

    OK per il main. Per la soluzione del problema tre while mi sembrano troppi.

    una cosa del genere può funzionare meglio
    
    int indexA = 0;
    int indexB = 0;
    while(indexA < VN1)
    {
    	if(A[indexA] == B[0])
    		break;
    	indexA++;
    }
    
    while(indexA < VN1 || indexB < VN2)
    {
    	if(A[indexA] != B[indexB])
    		break;
    	indexA++;
    	indexB++;
    }
    
    if(indexB == VN2)
    	*ptrfound = TRUE;
    else
    	*ptrfound = FALSE;
    
    un while x volta e hai risolto.
  • Re: Problema while in C

    Senza dubbio la tua soluzione è di gran lunga più chiara e funzionale. Ti ringrazio per la proposta. Quello che interessava a me però era riuscire a trovare l'errore nel mio codice. I tre while annidati li avevo messi apposta per capire più a fondo il loro funzionamento. Per quanto ho capito vengono controllate le due condizioni dei due while più esterni, poi quella del while più interno ed infine si procede con le istruzioni del while più interno, risalendo verso l'esterno quando le varie guardie restituiscono 0. Secondo questa logica la mia funzione dovrebbe essere corretta. Evidentemente o il mio ragionamento è errato oppure c'è un altro problema.
  • Re: Problema while in C

    Ho semplificato il codice. Adesso c'è un solo while annidato in un while. C'è sempre il solito problema che non esce dal loop. Quindi il codice è più semplice ma il problema è lo stesso. Se qualcuno mi riuscisse ad aiutare ora, capirei anche perchè non esce dal loop con tre while. Grazie.

    P.S.: Ho fatto delle prove per vedere a che punto non usciva dal loop. Mettendo un printf nel while più interno non viene stampato nulla a schermo. Mettendo un printf dentro il primo while (ma fuori da quello più interno) viene stampato a schermo sempre la solita stringa in modo infinito. Se non chiudo il programma non esce dal loop.
    int controllo(int *V1,int *V2,int VN1,int VN2, int *ptrfound)
    {
    
         int a;
         int b;
         a=0;
         b=0;
         
        
         while(b<=(VN1-VN2))
              {
                  
                            while((V1[a+b]==V2[a])&&(a<VN2))
                                                 {
                                                  a=a++; 
                                                  if(a=VN2-1){
                                                              printf("Ok, fine");
                                                              *ptrfound=TRUE;
                                                              return *ptrfound;
                                                             }
                                                 }   
                                                       
                a=0;
                b=b++;
              }              
              printf("No");
              
    }
  • Re: Problema while in C

    Analizziamo il tuo codice allora.
    
    a=a++;
    b=b++;
    
    non sono leggittimi i C. Il loro funzionamento non è definito. Puoi risolvere con a = a+1 oppure a++.
  • Re: Problema while in C

    
    while(b<=(VN1-VN2))
    		{
    
    			while((V1[a+b]==V2[a])&&(a<VN2))
    			{
    				a++;
    				if(a==VN2-1)
    				{
    					printf("Ok, fine");
    					*ptrfound=TRUE;
    					return *ptrfound;
    				}
    			}   
    
    			a=0;
    			b++;
    		}    
    
    il tuo codice così modificato funziona.
  • Re: Problema while in C

    skynet ha scritto:


    il tuo codice così modificato funziona.
    Ho controllato adesso funziona. Quindi era solo un problema di illegalità dell'assegnazione. Grazie davvero.
Devi accedere o registrarti per scrivere nel forum
8 risposte