Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] problema con ricerca binaria(dicotomica)

    Salve a tutti, ho riscontrato un problema nel mio codice per trovare un elemento di un determinato vettore usando la ricerca binaria (chiamata anche dicotomica), il problema si sviluppa nel momento appunto della ricerca, non rileva l'elemento in questione. Questo è il codice:
    codice:
    //
    //  main.c
    //  vettore , ordinarlo + ricerca dicotomica
    //
    //  Created by Luciano Gavoni on 23/04/13.
    //  Copyright (c) 2013 Luciano Gavoni. All rights reserved.
    //
    
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    void caricaVettore( int vett[]);
    void ordinamento( int vett[]);
    void scambia( int vett[], int k, int p);
    void stampa( int vett[] );
    int ricercaDic (int x, int vett[]);
    #define MAX 100
    int main(int argc, char const *argv[])
    {
        int vett[ MAX ], num;
        caricaVettore( vett );
        ordinamento( vett );
        stampa( vett );
        printf("Quale numero vuoi cercare?\n");
        scanf("%d", &num);
        if ( ricercaDic(num, vett) == 1 )
            printf("Il numero da lei inserito è stato trovato\n");
        else
            printf("Il numero da lei inserito non è stato trovato\n");
        return 0;
    }
    
    void caricaVettore( int vett[])
    {
        srand( (unsigned) time( NULL ) );
        for (int i = 0; i < MAX; ++i)
            vett[ i ] = 1 + rand() % 1000;
    }
    
    void ordinamento( int vett[])
    {
        int i, j;
        for (i = 0; i < MAX -1; i++)
            for( j = i + 1; j < MAX; j++)
                if ( vett[i] > vett[j])
                    scambia(vett, i, j );
    }
    void scambia( int vett[], int k, int p )
    {
        int app = 0;
        app = vett[ k ] ;
        vett[ k ] = vett[ p ];
        vett[ p ] = app;
    }
    void stampa( int vett[])
    {
        int cont = 0;
        printf("I numeri generati casualmente e ordinati in ordine crescente sono:\n");
        for (int i = 0; i < MAX; ++i){
            printf("%3d\t", vett[i] );
            if ( cont == 5 ){
                printf("\n");
                cont = 0;
            }
            cont++;
        }
        
    }
    int ricercaDic (int x, int vett[])
    {
        int sx, dx, md, trovato;
        sx = trovato = 0;
        dx = MAX - 1 ;
        do
        {
            md = ( sx + dx) / 2;
            if ( (vett[ md ] == x) || (vett[ sx ] == x) || (vett[ dx ] == x ) )
                trovato = 1;
            else if ( vett[ md ] > x )
                dx = md - 1;
            else
                sx = md + 1;
        } while (sx < md && !trovato );
        return trovato;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    codice:
    ...
     if ( (vett[ md ] == x) || (vett[ sx ] == x) || (vett[ dx ] == x ) )
                trovato = 1;
    Porre trovato = 1 che senso ha?

    EDIT:Ho capito adesso,comunque ti conviene usare il tipo bool,a colpo d'occhio si capisce meglio . .

    La condizione del while è sbagliata

  3. #3
    Originariamente inviato da Marco1995
    Porre trovato = 1 che senso ha?

    EDIT:Ho capito adesso,comunque ti conviene usare il tipo bool,a colpo d'occhio si capisce meglio . .

    La condizione del while è sbagliata
    Per quale motivo la condizione del while sarebbe sbagliata?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Per quale motivo la condizione del while sarebbe sbagliata?
    Immagina di avere i seguenti numeri:
    1 75 192 413 532 560 602 872 944 974

    E voler cercare il numero 872

    Al primo ciclo md sx diventa = 5...che è più grande di md e quindi il while termina

    Prova a modificare il while e far terminare il ciclo quanto md raggiunge il valore di 0...

  5. #5
    Originariamente inviato da Marco1995
    Immagina di avere i seguenti numeri:
    1 75 192 413 532 560 602 872 944 974

    E voler cercare il numero 872

    Al primo ciclo md sx diventa = 5...che è più grande di md e quindi il while termina

    Prova a modificare il while e far terminare il ciclo quanto md raggiunge il valore di 0...
    Ha ragione, mi sono confuso, ragionandoci su il while corretto è il seguente:
    while (sx < dx && !trovato ) , avevo sbagliato a scrivere, al posto di "dx" avevo messo "md" che era il valore centrale.
    Grazie mille.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Ha ragione, mi sono confuso, ragionandoci su il while corretto è il seguente:
    while (sx < dx && !trovato ) , avevo sbagliato a scrivere, al posto di "dx" avevo messo "md" che era il valore centrale.
    Grazie mille
    Prego non c'è di che..

    P.s. Piccolo appunto..potresti risparmiarti l'utilizzo della variabile trovato...all'interno del while quando setti trovato a 1 ti basta fare un "return 1"...fuori dal while ti basta fare un "return 0".

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.