Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    101

    [C] Esercizio di merge tra 2 array ordinati

    Essendo alle "prime armi"con la programmazione ho "qualche" difficoltà.
    L'algoritmo dovrebbe unire 2 array ordinati(fino all'inserimento dei 2 array va tutto bene)mentre per la function di merge ho vari problemi potreste aiutarmi?
    p.s
    devo per forza farlo con la function!

    codice:
    #include<stdio.h>
    void merge(float k[],int b);
    main()
      {   
          int i,v,n,m;
          float x[100],j[100];
            printf("Inserisci la dimensione del primo array : ");
            scanf("%d",&n);
            printf("inserisci la dimensione del secondo array : ");
            scanf("%d",&m);
          for(i=0;i<n;i++)
            {
                          printf("Inserisci il %d elemento del primo array: ",i+1);
                          scanf("%f",&x[i]);
            }
                for(v=0;v<m;v++)
            {
                          printf("Inserisci il %d elemento del secondo array: ",v+1);
                          scanf("%f",&j[m]);
            }
    }
    
    void merge(float k[],int b)
      {
            int i,v,n,m,x;
            i=0;
            v=0;
            while ((i<n)&&(v<m))
              {
                             if (x[n]<j[m])
                              {
                                         k[b]=x[n];
                                         i++;
                              }
                             else
                              {
                                         k[b]=j[m];
                                         v++;
    
                             }
              }
              if i>n
                 {
                             for (b=n;b<(n+m);b++)
                              {
                                k[b]=j[v];
                              v++;
                              }
                 else
                             for(b=m;b<(n+m);b++)
                             {
                                 k[b]=x[n]
                              n++;
                              }
                 }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Se devi "fondere" due array, la funzione dovrebbe innanzitutto avere in input questi due array con relative lunghezze, non ti pare?

    Comunque la prossima volta posta il codice con i tag giusti, come previsto dal regolamento al punto 6. Specifica anche il linguaggio nel titolo del thread, punto 2 del regolamento.
    every day above ground is a good one

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Consiglio anche una lettura del regolamento per conoscere le norme di posting del codice e relativi tag. Punto 6.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    101
    Scusate (ho modificato il titolo) per il codice bhè grazie al mod.XD
    quindi la stringa da modificare sarebbe questa?potreste spiegarmi come?


    codice:
    void merge(float k[],int b)

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Zanzy
    quindi la stringa da modificare sarebbe questa?potreste spiegarmi come?
    Di certo non solo quella, ma è per dire: se una funzione deve fare il merging di due array, sembra ovvio che essa debba avere in input i due array, le loro lunghezze e (non necessariamente, potrebbe anche essere un valore di ritorno) un terzo array per l'output. Direi qualcosa del genere:

    codice:
    void merge(float array1[], int size1, float array2[], int size2, float array_output[], int size3)
    dove chiaramente size3 è dato dalla somma di size1 e size2.

    Per quanto riguarda l'implementazione, ti conviene studiare prima l'algoritmo per bene. Codice non ne scrivo perché tanto sul web se ne trova in abbondanza, e anzi qui sul forum proprio qualche giorno fa un utente ha postato lo stesso problema, quindi basterebbe una semplice ricerca per avere il codice, ma provaci da solo prima.
    every day above ground is a good one

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    101
    ecco ora mi crasha .....

    codice:
    #include<stdio.h>
    void merge(float x[],float j[],float k[],int n,int m);
    int main()
      {   
          int i,v,n,m,b;
          float x[100],j[100],k[200];
            printf("Inserisci la dimensione del primo array : ");
            scanf("%d",&n);
            printf("inserisci la dimensione del secondo array : ");
            scanf("%d",&m);
          for(i=0;i<n;i++)
            {
                          printf("Inserisci il %d elemento del primo array: ",i+1);
                          scanf("%f",&x[i]);
            }
                for(v=0;v<m;v++)
            {
                          printf("Inserisci il %d elemento del secondo array: ",v+1);
                          scanf("%f",&j[m]);
            }
            b=n+m;
            merge(x,j,k,n,m);
    }
    
    void merge(float x[],float j[],float k[],int n,int m)/*gli indici non si passano*/
      {
           int b,i,v;
           b=0;
               while ((i<n)&&(v<m))
              {
                             if (x[n]<j[m])
                              {
                                         k[b]=x[n];
                                         i++;
                              }
                             else
                              {
                                         k[b]=j[m];
                                         v++;
    
                             }
              }
              if (i>n)
                 {
                             for (b=n;b<(n+m);b++)
                              {
                                k[b]=j[v];
                              v++;
                              }
                 }
                 else
                 {
                             for(b=m;b<(n+m);b++)
                             {
                                 k[b]=x[n];
                              n++;
                              }
                 }
      }

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Hai fatto un po' di confusione.

    1) nella procedura merge(), inizializza tutti gli indici a 0, non solo b;
    2) attenzione a non fare confusione tra indici e size: sia in main() che in merge() hai usato più volte m e n come indici, e non i, v e b;
    3) in main() hai calcolato correttamente b come n + m, ma non lo hai passato alla funzione.
    every day above ground is a good one

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    101
    Ok cambiato tutto
    però non mi legge il secondo array




    codice:
    #include<stdio.h>
    void merge(float x[],float j[],float k[],int n,int m);
    int main()
      {   
          int i,v,n,m,b;
          float x[100],j[100],k[200];
            printf("Inserisci la dimensione del primo array : ");
            scanf("%d",&n);
            printf("inserisci la dimensione del secondo array : ");
            scanf("%d",&m);
          for(i=0;i<n;i++)
            {
                          printf("Inserisci il %d elemento del primo array: ",i+1);
                          scanf("%f",&x[i]);
            }
                for(v=0;v<m;v++)
            {
                          printf("Inserisci il %d elemento del secondo array: ",v+1);
                          scanf("%f",&j[v]);
            }
            b=n+m;
            merge(x,j,k,n,m);
            printf("l'array unito è: ");
            for(i=0;i<b;i++)
            {
                printf("%f \n",k[i]);
            }
            system("pause");
            return 0;
    }
    
    void merge(float x[],float j[],float k[],int n,int m)/*gli indici non si passano*/
      {
           int b,i,v;
           b=0;
           i=0;
           v=0;  
              while ((i<n)&&(v<m))
              {
                             if (x[i]<j[v])
                              {
                                         k[b]=x[i];
                                         i++;
                              }
                             else
                              {
                                         k[b]=j[v];
                                         v++;
                              }
                             b++;
              }
              if (i>n)
                 {
                             for (b;b<(n+m);b++)
                              {
                                k[b]=j[v];
                                 v++;
                              }
                 }
                 else
                 {
                             for(b;b<(n+m);b++)
                             {
                                 k[b]=x[i];
                                  i++;
                              }
                 }
      }

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Hai solo dimenticato di aggiustare la questione degli indici anche in main()

    codice:
    for (v = 0; v < m; v++) {
          printf("Inserisci il %d elemento del secondo array: ",v+1);
          scanf("%f", &j[v]);
    }
    avevi utilizzato ancora m (per inciso, quel &j[v] lo puoi scrivere semplicemente come j + v. Osservazione simile per l'altro array).

    Poi c'è anche un altro errore in merge():

    codice:
       ...
       if (i >= n) {
       ...
    una volta fuori dal while, devi controllare se i è uguale o no a n. In realtà ci andrebbe bene anche solo i == n, l'importante è che l'uguale ci sia. Scrivendo solo > non va, segui la logica degli indici e ti sarà chiaro.

    Per il resto, funziona. Se vuoi usare system("PAUSE") includi l'header stdlib.h (ma comunque evita l'utilizzo di system(), per bloccare l'esecuzione del programma mettici una gethcar()), e poi nei due cicli for finali della funzione merge() quel b; non ha alcun effetto. Puoi semplicemente scrivere:

    codice:
       for ( ; b < (n+m); b++)
    lasciando quindi vuoto il campo inizializzazione (o magari potresti sostituire il for con un while).
    every day above ground is a good one

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    101
    grazie ora il programma funziona!(l'indice in main l'avevo cambiato credendo che nessuno mi stava ancora rispondendo)
    mentre l'errore nel merge non l'avevo proprio capito!
    p.s.
    sto lavorando col devc++ cambierà qualcosa quando lavorerò con il vi di linux?

    mi spiegheresti gentilmente come "stoppare" l'esecuzione cambiando il system("pause") con il getchar?

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.