PROBLEMA Ordinamento per fusione (C++)

Pubblicità

BigMarioss

Utente Attivo
Messaggi
360
Reazioni
10
Punteggio
38
Buongiorno ragazzi mi serve una mano... Dove sbaglio? I commenti che ci ho messo sono corretti? Forse non ho capito qualcosa...

PS: questo è merge sort??

C++:
/* Ordinamento per fusione.

Scrivere un programma che ordina in senso non decrescente due
sequenze di numeri positivi memorizzate su due array A e B, ciascuno dei quali ordinato (in senso
non decrescente), riempiendo un terzo array C che conterrà la sequenza totalmente ordinata.

-definire una dimensione massima dei vettori A e B;
-inserire le due sequenze da tastiera;
-stampare la sequenza totalmente ordinata in C.
*/

#include<stdio.h>
#include<stdlib.h>
#define NUM 20

int main(){

  int A[NUM], B[NUM], C[NUM];
  int i=0, j=0, k=0, na, nb, nc;   // i, j, k sono variabili che servono rispettivamente per ciascun array, per non confonderli nei vari cicli
  int count=0;

  printf("\nInserisci la dimensione della prima sequenza: ");
  scanf("%d", &na);

  printf("\nInserisci la dimensione della seconda sequenza: ");
  scanf("%d", &nb);

  nc = na + nb;

  printf("\nPrima sequenza:\n\n");
  for (i=0; i < na; i++){
    printf("Dato %d: ", i+1);
    scanf("%d", &A[i]);
  }

  printf("\nSeconda sequenza:\n\n");

  for (i=0; i < nb; i++){
    printf("Dato %d: ", i+1);
    scanf("%d", &B[i]);
  }

  printf("\n");

  /*ordina: scandisci sia A sia B e confronta
    i due elementi considerati ad ogni passo*/

    while(i<na && j<nb){   // while serve per terminare l'inserimento dei numeri nel vettore C

        if(A[i] <= B[j]){    // confronta i numeri di A con quelli di B e memorizza in C i numeri adeguati alle rispettive condizioni
            C[k] = A[i];
            i++;
        }

        else{
            C[k] = B[j];
            j++;
        }

    k++;                   // incrementa SEMPRE l'indice di C per memorizzare di volta in volta nuovi dati

    }



    if(i >= na){           //  memorizza gli eventuali restanti numeri di B in C

        int h;

        for(h=j; h < nb; h++){
            C[k] = B[h];
            k++;
        }
   }

    else if(j >= nb){       //  memorizza gli eventuali restanti numeri di A in C

        int h;

        for(h=i; h < na; h++){
            C[k]=A[h];
            k++;
        }
    }

  printf("Elementi di C:\n");     // stampa i numeri di C

    for(k=0; k < nc; k++){
        printf("%d,\t", C[k]);
    }

}
 
Devi prima ordinare sia A che B
Però dovrebbe almeno stampare i numeri di C non ordinati...

Comunque ho provato anche così ma non funziona... dovrebbe stampare almeno i numeri non in ordine invece stampa solo "0"

C++:
#include<stdio.h>
#include<stdlib.h>
#define NUM 20

int main(){

  int A[NUM], B[NUM], C[NUM];
  int i=0, j=0, k=0, na, nb, nc;   // i, j, k sono variabili che servono rispettivamente per ciascun array, per non confonderli nei vari cicli
  int count=0;

  printf("\nInserisci la dimensione della prima sequenza: ");
  scanf("%d", &na);

  printf("\nInserisci la dimensione della seconda sequenza: ");
  scanf("%d", &nb);

  nc = na + nb;

  printf("\nPrima sequenza:\n\n");
  for (i=0; i < na; i++){
    printf("Dato %d: ", i+1);
    scanf("%d", &A[i]);
  }

  printf("\nSeconda sequenza:\n\n");

  for (i=0; i < nb; i++){
    printf("Dato %d: ", i+1);
    scanf("%d", &B[i]);
  }

  printf("\n");

  for (i=0; i < na; i++){
    for(j=0; j < nb; j++){
      C[k] = B[j];
      k++;
    }
    C[k] = A[i];
    k++;
  }

  for(k; k < nc; k++){
    printf("%d,\t", C[k]);
  }
 
Codice:
for(k; k < nc; k++){
    printf("%d,\t", C[k]);
  }
Qui non entrerà mai, devi partire da 0. Il nuovo codice che hai messo è completamente sbagliato. Il primo andava bene, ti basta ordinare i due array prima
 
In quale punto devo ordinarli?
Ovviamente prima di unirli! Mica dopo!

Poi, errore logico, dichiari C con lunghezza NUM quando dovrebbe essere 2 * NUM (se è una unione di due vettori di lunghezza NUM sarà NUM + NUM). E comunque chiama MAX e non NUM la macro.

Ma il codice è C o C++? Perché i codici che posti sono commentati come C++
 
Ovviamente prima di unirli! Mica dopo!

Poi, errore logico, dichiari C con lunghezza NUM quando dovrebbe essere 2 * NUM (se è una unione di due vettori di lunghezza NUM sarà NUM + NUM). E comunque chiama MAX e non NUM la macro.

Ma il codice è C o C++? Perché i codici che posti sono commentati come C++
E' C++
 
Perché usate funzioni di stdio invece di oggetti di iostream allora?
Non so cosa dirti, ci fanno usare quelle...

Comunque ho provato a riordinare ma mi stampa numeri a caso...

C++:
#include<stdio.h>
#include<stdlib.h>
#define NUM 20

int main(){

  int A[NUM], B[NUM], C[2*NUM];
  int i=0, j=0, k=0, na, nb, nc;   // i, j, k sono variabili che servono rispettivamente per ciascun array, per non confonderli nei vari cicli
  int temp, x, y;

  printf("\nInserisci la dimensione della prima sequenza: ");
  scanf("%d", &na);

  printf("\nInserisci la dimensione della seconda sequenza: ");
  scanf("%d", &nb);

  nc = na + nb;

  printf("\nPrima sequenza:\n\n");
  for (i=0; i < na; i++){
    printf("Dato %d: ", i+1);
    scanf("%d", &A[i]);
  }

  printf("\nSeconda sequenza:\n\n");

  for (i=0; i < nb; i++){
    printf("Dato %d: ", i+1);
    scanf("%d", &B[i]);
  }

  printf("\n");

// ordina A in modo crescente

  for(i=0; i < na-1; i++){
    for(x=na-1; x > i; x--){
      if (A[x-1] > A[x]){
        temp = A[x-1];
        A[x-1] = A[x];
        A[x] = temp;
      }
    }
  }

  // ordina B in modo crescente

    for(j=0; j < nb-1; j++){
      for(y=nb-1; y > j; y--){
        if (B[y-1] > B[y]){
          temp = B[y-1];
          B[y-1] = B[y];
          B[y] = temp;
        }
      }
    }

  for(i=0; i < na; i++){
    printf("%d ", &A[i]);
  }

  for(j=0; j < nb; j++){
    printf("%d ", &B[j]);
  }
}
 
Oltre a quanto detto, anche se non è espressamente specificato, visto che hai dichiarato A e B come array statici di 20 elementi, quando chiedi all'utente le dimensioni delle sequenze na ed nb, inserisci un controllo sul valore inserito. Se, infatti, l'utente inserisce il valore di na > 20 ci sarà un overflow

Inviato dal mio SM-N9005 utilizzando Tapatalk
 
Pubblicità
Pubblicità
Indietro
Top