Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [C] Ricerca binaria

Hybrid View

  1. #1
    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.

  2. #2
    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

  3. #3
    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;
                }
            }
    }

  4. #4
    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?

  5. #5
    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");
            }
    }

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.