Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [C] Ricerca binaria

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113

    [C] Ricerca binaria

    Ciao a tutti,
    vorrei sapere se la ricerca binaria si può effettuare solo su file ad accesso casuale (binari) oppure se anche su quelli ad acesso sequenziale.
    Ho pensato che è possibile farlo per entrambi i tipi di file riportando i dati in memoria (una struct per esempio) ordinandoli e di conseguenza effettuare la ricerca binaria..cosa mi dite?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il termine "binaria" non ha nulla a che fare con il tipo di file da cui provengono i dati.

    Indica soltanto che l'algoritmo procede nella ricerca selezionando, di volta in volta, metà dell'insieme esaminato (quindi fa una selezione tra due insiemi).

    Se i dati sono in memoria e sono ordinati, non ha importanza da dove provengono.

    P.S. Ma perché non ti avvali della documentazione che puoi trovare su internet? Ad esempio wikipedia?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    si si faccio ricerche in rete però mi fido con certezza più di questo forum perchè ricevo risposte specifiche e sicure.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Semmai

    track[middle].titolo
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Semmai

    track[middle].titolo
    si infatti avevo già trovato questo errore e ora mi da errore di segmantation fault
    codice:
    
    #include <stdio.h>
    #include <string.h>
    #define n 100
    
    struct tracce {
            char titolo[20];
            int copie;
    }tra[n];
    
    void ricerca (struct tracce *track, char *key, int low, int high, int v);
    
    
    int main()
    {
        int i, j, k, V;
        char buffer[20];
        char tit[20];
        int num, app;
        char chiave[20];
    
        FILE *cfPtr;
    
    
        if ((cfPtr = fopen("brani.dat", "w")) == NULL ) {
            printf("IL file non può essere aperto.\n");
        } else {
            i = 0;
            printf("Inserisci titolo e copie vendute\n");
            printf("Inserisci EOF per terminare\n");
            scanf("%s%d\n", tra[i].titolo, &tra[i].copie);
            fprintf(cfPtr, "%30s", "BRANI\n");
            fprintf(cfPtr, "%20s %20s", "TITOLO", "COPIE VENDUTE\n");
            fprintf(cfPtr, "%20s %20d\n", tra[i].titolo, tra[i].copie);
            while( !feof(stdin) ) {
                i++;
                scanf("%s%d\n", tra[i].titolo, &tra[i].copie);
                fprintf(cfPtr, "%20s %20d\n", tra[i].titolo, tra[i].copie);
                }
                fclose(cfPtr);
        }
        printf("%d", i);
        printf("\n\n");
    
        for ( j = 0; j < i; i++ ) {
            for ( k = j + 1; k <= i; k++ ) {
                if (strcmp(tra[j].titolo, tra[k].titolo) > 0 ) {
                    strcpy(buffer, tra[j].titolo);
                    strcpy(tra[j].titolo, tra[k].titolo);
                    strcpy(tra[k].titolo, buffer);
                    app = tra[j].copie;
                    tra[j].copie = tra[k].copie;
                    tra[k].copie = app;
                }
            }
        }
    
        printf("Inserisci il titolo da cercare : \n");
        scanf("%s", chiave);
    
        ricerca(tra, chiave, 0, i, V);
    
        if ( V = 1 ) {
            printf("Il brano cercato è stato trovato\n");
        } else if ( V == 0 )
        {
            printf("Il brano cercato NON è stato trovato\n");
        }
    
    
    
    
    
    
    
    
        return 0;
    }
    
    void ricerca (struct tracce *track, char *key, int low, int high, int v)
        {
            int middle;
    
            v = 0;
            while (low <= high) {
                middle = (low + high) / 2;
                if (strcmp (key, track[middle].titolo) == 0) {
                    v = 1;
                } else if (strcmp(key, track[middle].titolo) < 0) {
                    high = middle - 1;
                } else {
                    low = middle + 1;
                }
            }
    
        }
    credo nellla fase di ordinamento..
    Ultima modifica di sizeof; 18-10-2013 a 13:36

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    Qualcuno sa dirmi cosa sbaglio in questo programma..perchè non mi accetta la chiave di ricerca ???
    codice:
    #include <stdio.h>
    #include <string.h>
    #define n 100
    
    struct tracce {
            char titolo[20];
            int copie;
    }tra[n];
    
    void ricerca (struct tracce track[], char key[], int low, int high, int v);
    
    
    int main()
    {
        int i, j, k, V;
        char buffer[20];
        char tit[20];
        int num, app;
        char chiave[20];
    
        FILE *cfPtr;
    
    
        if ((cfPtr = fopen("brani.dat", "w")) == NULL ) {
            printf("IL file non può essere aperto.\n");
        } else {
            i = 0;
            printf("Inserisci titolo e copie vendute\n");
            printf("Inserisci EOF per terminare\n");
            scanf("%s%d\n", tra[i].titolo, &tra[i].copie);
            fprintf(cfPtr, "%30s", "BRANI\n");
            fprintf(cfPtr, "%20s %20s", "TITOLO", "COPIE VENDUTE\n");
            fprintf(cfPtr, "%20s %20d\n", tra[i].titolo, tra[i].copie);
            while( !feof(stdin) ) {
                i++;
                scanf("%s%d\n", tra[i].titolo, &tra[i].copie);
                fprintf(cfPtr, "%20s %20d\n", tra[i].titolo, tra[i].copie);
                }
                fclose(cfPtr);
        }
    
        printf("\n\n");
    
        for ( j = 0; j < i; j++ ) {
            for ( k = j + 1; k <= i; k++ ) {
                if (strcmp(tra[j].titolo, tra[k].titolo) > 0 ) {
                    strcpy(buffer, tra[j].titolo);
                    strcpy(tra[j].titolo, tra[k].titolo);
                    strcpy(tra[k].titolo, buffer);
                    app = tra[j].copie;
                    tra[j].copie = tra[k].copie;
                    tra[k].copie = app;
                }
            }
        }
    
        printf("%30s", "BRANI\n");
        printf("%20s %20s", "TITOLO", "COPIE VENDUTE\n");
        for ( j = 0; j <= i; j++ ) {
            printf("%20s %19d\n", tra[j].titolo, tra[j].copie);
        }
    
    
    
    
        printf("Inserisci il titolo da cercare : \n");
        scanf("%s", chiave);
    
    
    
        ricerca(tra, chiave, 0, i, V);
    
        printf("%d\n", V);
    
        if ( V = 1 ) {
            printf("Il brano cercato è stato trovato\n");
        } else if ( V == 0 )
        {
            printf("Il brano cercato NON è stato trovato\n");
        }
    
    
        return 0;
    }
    
    void ricerca (struct tracce track[], char key[], int low, int high, int v)
    {
            int middle;
    
            v = 0;
            while (low <= high) {
                middle = (low + high) / 2;
                if (strcmp (key, track[middle].titolo) == 0) {
                    v = 1;
                } else if (strcmp(key, track[middle].titolo) < 0) {
                    high = middle - 1;
                } else {
                    low = middle + 1;
                }
            }
    }

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    A quanto pare la procedura non mi restituisce il valore intero di V ma il suo indirizzo...è questo che sbaglio?

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    Alla fine ho rimediato in questo modo..però quello di prima non l'ho ancora capito

    codice:
    
    #include <stdio.h>
    #include <string.h>
    #define n 100
    
    struct tracce {
            char titolo[20];
            int copie;
    }tra[n];
    
    void ricerca (struct tracce track[], char key[], int low, int high);
    
    
    int main()
    {
        int i, j, k, V;
        char buffer[20];
        char tit[20];
        int num, app;
        char chiave[20];
    
        FILE *cfPtr;
    
    
        if ((cfPtr = fopen("brani.dat", "w")) == NULL ) {
            printf("IL file non può essere aperto.\n");
        } else {
            i = 0;
            printf("Inserisci titolo e copie vendute\n");
            printf("Inserisci EOF per terminare\n");
            scanf("%s%d\n", tra[i].titolo, &tra[i].copie);
            fprintf(cfPtr, "%30s", "BRANI\n");
            fprintf(cfPtr, "%20s %20s", "TITOLO", "COPIE VENDUTE\n");
            fprintf(cfPtr, "%20s %20d\n", tra[i].titolo, tra[i].copie);
            while( !feof(stdin) ) {
                i++;
                scanf("%s%d\n", tra[i].titolo, &tra[i].copie);
                fprintf(cfPtr, "%20s %20d\n", tra[i].titolo, tra[i].copie);
                }
                fclose(cfPtr);
        }
    
        printf("\n\n");
    
        for ( j = 0; j < i; j++ ) {
            for ( k = j + 1; k <= i; k++ ) {
                if (strcmp(tra[j].titolo, tra[k].titolo) > 0 ) {
                    strcpy(buffer, tra[j].titolo);
                    strcpy(tra[j].titolo, tra[k].titolo);
                    strcpy(tra[k].titolo, buffer);
                    app = tra[j].copie;
                    tra[j].copie = tra[k].copie;
                    tra[k].copie = app;
                }
            }
        }
    
        printf("%30s", "BRANI\n");
        printf("%20s %20s", "TITOLO", "COPIE VENDUTE\n");
        for ( j = 0; j <= i; j++ ) {
            printf("%20s %19d\n", tra[j].titolo, tra[j].copie);
        }
    
    
    
    
        printf("Inserisci il titolo da cercare : \n");
        scanf("%s", chiave);
    
        ricerca(tra, chiave, 0, i);
    
    
    
    
    
    
    
    
        return 0;
    }
    
    void ricerca (struct tracce track[], char key[], int low, int high)
    {
            int middle;
            int v;
    
    
            while (low <= high) {
                middle = (low + high) / 2;
                v = strcmp (key, track[middle].titolo);
                if ( v == 0) {
                    printf("Il brano cercato è stato trovato\n");
                    break;
                } else if ( v < 0) {
                    high = middle - 1;
                } else {
                    low = middle + 1;
                }
            }
            if ( v != 0 ) {
                printf("Il brano cercato NON è stato trovato\n");
            }
    }

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    Ho fatto in questo modo, passando la struct e la chiave di ricerca per riferimento :
    codice:
    #include <stdio.h>
    #include <string.h>
    #define n 100
    
    struct tracce {
            char titolo[20];
            int copie;
    }tra[n];
    
    void ricerca (struct tracce *track, char *key, int low, int high, int v);
    
    
    int main()
    {
        int i, j, k, V;
        char buffer[20];
        char tit[20];
        int num, app;
        char chiave[20];
    
        FILE *cfPtr;
    
    
        if ((cfPtr = fopen("brani.dat", "w")) == NULL ) {
            printf("IL file non può essere aperto.\n");
        } else {
            i = 0;
            printf("Inserisci titolo e copie vendute\n");
            printf("Inserisci EOF per terminare\n");
            scanf("%s%d\n", tra[i].titolo, &tra[i].copie);
            fprintf(cfPtr, "%30s", "BRANI\n");
            fprintf(cfPtr, "%20s %20s", "TITOLO", "COPIE VENDUTE\n");
            fprintf(cfPtr, "%20s %20d\n", tra[i].titolo, tra[i].copie);
            while( !feof(stdin) ) {
                i++;
                scanf("%s%d\n", tra[i].titolo, &tra[i].copie);
                fprintf(cfPtr, "%20s %20d\n", tra[i].titolo, tra[i].copie);
                }
                fclose(cfPtr);
        }
        printf("%d", i);
        printf("\n\n");
    
        for ( j = 0; j < i; i++ ) {
            for ( k = j + 1; k <= i; k++ ) {
                if (strcmp(tra[j].titolo, tra[k].titolo) > 0 ) {
                    strcpy(buffer, tra[j].titolo);
                    strcpy(tra[j].titolo, tra[k].titolo);
                    strcpy(tra[k].titolo, buffer);
                    app = tra[j].copie;
                    tra[j].copie = tra[k].copie;
                    tra[k].copie = app;
                }
            }
        }
    
        printf("Inserisci il titolo da cercare : \n");
        scanf("%s", chiave);
    
        ricerca(tra, chiave, 0, i, V);
    
        if ( V = 1 ) {
            printf("Il brano cercato è stato trovato\n");
        } else if ( V == 0 )
        {
            printf("Il brano cercato NON è stato trovato\n");
        }
    
    
    
    
    
    
    
    
        return 0;
    }
    
    void ricerca (struct tracce *track, char *key, int low, int high, int v)
        {
            int middle;
    
            v = 0;
            while (low <= high) {
                middle = (low + high) / 2;
                if (strcmp (key, track.titolo[middle]) == 0) {
                    v = 1;
                } else if (strcmp(key, track.titolo[middle]) < 0) {
                    high = middle - 1;
                } else {
                    low = middle + 1;
                }
            }
    
        }
    il problema è nel confronto all'interno della procedura tra le 2 stringhe, cioè qui
    codice:
    ...
    if (strcmp (key, track.titolo[middle]) == 0) {
                    v = 1;
                } else if (strcmp(key, track.titolo[middle]) < 0) {
    ...
    mi dice che titolo non è una struttura...cosa sbaglio ?
    Ultima modifica di sizeof; 18-10-2013 a 13:17

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 © 2025 vBulletin Solutions, Inc. All rights reserved.