PROBLEMA DI VERIFICA SU ARRAY

di Anonimizzato22387 il
11 risposte
Salve a tutti, ho un problema con il seguente codice. Il programma dovrebbe verificare se in un dato array esistono due numeri consecutivi pari ed almeno uno dei due è un multiplo di tre. Non riesco a capire dove sbaglio. Il programma deve contenere una funzione ricorsiva. Scusate ma nelle printf ho cercato di non riscrivere tutta la specifica del problema. Grazie in anticipo.

#include <stdio.h>
#include <stdlib.h>


int pariedUnMultiploDiTreRic(int *array, int lunghezza, int i){
int verificata;
if (lunghezza <=1)
verificata =0;
else {
if (((array) % 2 == 0)&&((array[i+1]) % 2 == 0)){
if(((array) % 3 == 0)||((array[i+1]) % 3 == 0))
verificata=1;
else
verificata=pariedUnMultiploDiTreRic(array,lunghezza,i+1);
}

}
return verificata;
}



int pariedUnMultiploDiTre(int *array, int lunghezza){
int i = 0;
int verifica;
verifica = pariedUnMultiploDiTreRic(array,lunghezza,i);
return verifica;
}

int main(){
int verifica=0;
int lunghezza;
int i;
printf("Salve, sono un programma che trova una coppia blablabla pari e multiplo di tre\n");
printf("quanto sara' lunga la tua stringa?\n");
scanf("%d", &lunghezza);
int array[lunghezza];
printf("itroduci i numeri\n");
for(i=0;i<=lunghezza-1;i++){
printf("inserisci il %d numero: ", i+1);
scanf("%d", &array);
}
int *punt=array;
verifica = pariedUnMultiploDiTre(punt,lunghezza);
if(verifica)
printf("yeah\n");
else
printf("niente da fare ciao\n");

}

11 Risposte

  • Inizia dicendoci cosa non funziona
  • Qualsiasi vettore inserisco la verifica dà sempre esito true.
  • Prova a mettere una condizione che smette di far ripetere la funzione di ricerca se i+1 >= lunghezza

    Edit

    Anzi scusa ho scritto male, te lo dico meglio: metti la condizione che fa continuarea ricorsione solo se alla prossima esecuzione sei sicuro che i non esca dai limiti dell'array. Praticamente devi continuare finché non finisci i numeri nell'array, sennò vai fuori e sballa tutto
  • Ho risolto. Innanzitutto grazie ANDPRI per la tempestiva risposta. L'errore sta nel non inizializzare la variabile verificata=0 nella funzione ricorsiva.
    riporto il codice giusto cosicché in futuro magari possa essere di aiuto a qualcuno.
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int pariedUnMultiploDiTreRic(int *array, int lunghezza, int i){
        int verificata=0;
        if (lunghezza <=1)
            verificata =0;
            else {
                if (((array[i]) % 2 == 0)&&((array[i+1]) % 2 == 0)){
                    if(((array[i]) % 3 == 0)||((array[i+1]) % 3 == 0))
                    verificata=1;
                    else
                    verificata=pariedUnMultiploDiTreRic(array,lunghezza,i+1);
                } 
                
            }           
        return verificata;
    } 
            
          
    
    int pariedUnMultiploDiTre(int *array, int lunghezza){
        int i = 0;
        int verifica;
        verifica = pariedUnMultiploDiTreRic(array,lunghezza,i);
        return verifica;
    }
    
    int main(){
        int verifica=0;
        int lunghezza;
        int i;
        printf("Salve, sono un programma che trova una coppia blablabla pari e multiplo di tre\n");
        printf("quanto sara' lunga la tua stringa?\n");
        scanf("%d", &lunghezza);
        int array[lunghezza];
        printf("itroduci i numeri\n");
        for(i=0;i<=lunghezza-1;i++){
            printf("inserisci il %d numero: ", i+1);
            scanf("%d", &array[i]);
        }
        int *punt=array;
        verifica = pariedUnMultiploDiTre(punt,lunghezza);
                if(verifica)
                    printf("yeah\n");
                    else
                        printf("niente da fare ciao\n");
                        
    }
        
    [\code]
  • Ma sei sicuro di aver risolto così? Leggi la risposta di prima, l'ho modificata perché avevo sbagliato
  • Intendi cosi?
    
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int pariedUnMultiploDiTreRic(int *array, int lunghezza, int i){
        int verificata=0;
        if (i+1>=lunghezza)
            verificata =0;
            else {
                if (((array[i]) % 2 == 0)&&((array[i+1]) % 2 == 0)){
                    if(((array[i]) % 3 == 0)||((array[i+1]) % 3 == 0))
                    verificata=1;
                    else
                    verificata=pariedUnMultiploDiTreRic(array,lunghezza,i+1);
                } 
                
            }           
        return verificata;
    } 
    
    [\code]
  • No. Devi metterla dopo, subito prima di chiamare la ricorsione. Perché così interrompi la ripetizione se i va oltre i limiti dell'array (comunque non è i+1>=lunghezza, ho sbagliato a scrivere. La condizione giusta cerca di trovarla da solo, pensando a come funziona la funzione)
  • Credo di aver capito o almeno spero.:


    int pariedUnMultiploDiTreRic(int *array, int lunghezza, int i){
    int verificata=0;
    if (lunghezza <=1)
    verificata =0;
    else {
    if (((array) % 2 == 0)&&((array[i+1]) % 2 == 0)){
    if(((array) % 3 == 0)||((array[i+1]) % 3 == 0))
    verificata=1;
    else
    verificata=pariedUnMultiploDiTreRic(array,lunghezza-1,i+1);
    }

    }
    return verificata;
    }

    cosi facendo decremento la variabile lunghezza ad ogni ricorsione fino al caso base(lunghezza =1). Spero sia giusto il mio ragionamento.
  • Ah non ci avevo pensato. Forse può funzionare anche così, io ho messo un if prima di chiamare la funzione ma penso vada bene lo stesso
  • Niente da fare. Quando si tratta di array di massimo 3 di dimensione funziona; quando però ho provato a inserire questo array {1,2,3,4,6} mi ritorna false quando in teoria dovrebbe essere true; Non riesco a capire proprio dove sia il problema nonostante è un problema semplice .
    
    int pariedUnMultiploDiTreRic(int *array, int lunghezza, int i){
        int verificata=0;
        if (lunghezza <=1)
            verificata =0;
            else {
                if (((array[i]) % 2 == 0)&&((array[i+1]) % 2 == 0)){
                    if(((array[i]) % 3 == 0)||((array[i+1]) % 3 == 0))
                    verificata=1;
                    else 
                    verificata=pariedUnMultiploDiTreRic(array,lunghezza-1,i+1);
                } 
                
            }           
        return verificata;
    } 
      
    
  • Non saprei, nel modo in cui l'ho modificato io funziona, comunque ti conviene unire quei due if consecutivi in un unico grande if che li verifica entrambi. E poi metti la condizione che se verificata chiama la funzione, sennò passa al return. Così è più ordinato e capisci meglio
Devi accedere o registrarti per scrivere nel forum
11 risposte