Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it L'avatar di Fabiuz
    Registrato dal
    Nov 2004
    Messaggi
    892

    [C] Permutazione di vettore!

    Ciao a tutti, eccomi alla presa con 1 altro problema:
    Devo permutare gli elementi di un vettore, ovvero scambiarli di posto. Se sono negativi metterli alla destra della metà del vettore, se sono positivi devo metterli alla sinistra. Questa è la mia soluzione:

    codice:
    #include <stdio.h>
    #define N 10
    
    void positiviNegativi(int v[],int dim){
     int i;
     int *p1,*p2,app=0;
     p1=&(v[0]);
     p2=&(v[dim-1]);
     for (i=0; i<=dim/2; i++){
      if (p1<0){
        app=*(p1);
        *(p1)=*(p2);
        *(p2)=app;
        p1++;
        p2--;
      }
     }
    }
    
    int main(){
      int i;
      int v[N]={3,-4,6,-8,4,-2,8,-2,7,-12};
      printf("Vettore non permutato: \n");
      for (i=0; i<=N-1; i++){
        printf("%4d", v[i]);}
      printf("\n");  
      positiviNegativi(v,N);
      printf("Vettore permutato: \n");
      for (i=0; i<=N-1; i++)
        printf("%4d", v[i]);
      printf("\n"); 
      return 0;
    }
    ma come mai non funge ??????
    Debian Sarge 3.01a
    Slackware 10.2

  2. #2
    Utente di HTML.it L'avatar di Fabiuz
    Registrato dal
    Nov 2004
    Messaggi
    892
    un helpino??????
    Debian Sarge 3.01a
    Slackware 10.2

  3. #3
    Odio i puntatori. Non mi ricordo mai la sintassi che devo utilizzare. Devo sempre fare cinque sei tentativi prima anche solo di riuscire a compilare. Prova cosi' cmq:

    codice:
      if (*p1<0){
        app=*(p1);
        p1=*(p2);
        p2=app;
        p1++;
        p2--;
      }
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  4. #4
    Utente di HTML.it L'avatar di Fabiuz
    Registrato dal
    Nov 2004
    Messaggi
    892
    no no! niente da fare!
    Debian Sarge 3.01a
    Slackware 10.2

  5. #5
    Dovresti specificare cosa fa pero'.
    Cioe'... compila ma i numeri sono nell'ordine sbagliato?
    Compila e i numeri restano immutati?
    Compila e i numeri non sono piu' quelli che hai inserito?
    Compila e da errore?
    Non compila proprio?
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  6. #6
    Utente di HTML.it L'avatar di Fabiuz
    Registrato dal
    Nov 2004
    Messaggi
    892
    allora ho risolto così:
    codice:
    #include <stdio.h>
    #define N 10
    
    void positiviNegativi2(int v[],int dim){
     int i;
     int *p1,*p2,app=0;
     p1=&(v[0]);
     p2=&(v[dim-1]);
     for(i=0; (i<=dim/2); i++){
      if (v[i]<=0){
        app=*(p1);
        *(p1)=*(p2);
        *(p2)=app;
        p1++;
        p2--;
      }
     }
    }
    
    int main(){
      int i;
      int v[N]={3,-4,6,-8,4,-2,8,-2,7,-12};
      printf("Vettore originale: ");
      for (i=0; i<=N-1; i++)
        printf("%4d", v[i]);
      positiviNegativi2(v,N);
      printf("\n\n");
      printf("Vettore permutato: ");
      for (i=0; i<=N-1; i++)
        printf("%4d", v[i]);
      printf("\n\n"); 
      return 0;
    }
    ma mi scambia gli elementi nel modo sbagliato! Non deve fare cosi!
    dovrebbe portare gli elementi negativi nella porzione finale dell'array mentre gli elementi positivi nella porzione iniziale!
    Debian Sarge 3.01a
    Slackware 10.2

  7. #7
    Non e' sufficiente spostare solo i negativi a destra.
    Ad esempio, se hai v = {-1, 2, -3} il risultato sarebbe {-3, 2, -1}
    Hai scambiato -1 e -3 senza risoolvere niente. L'algoritmo va ripensato...
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  8. #8
    Utente di HTML.it L'avatar di Fabiuz
    Registrato dal
    Nov 2004
    Messaggi
    892
    1 aiutino??

    siccome posso solo scorrere l'array solo una volta e non posso usare array di supporto mi è venuta in mente solo questa idea qua!

    altro non mi viene!
    che posso fà (p.s anche io odio i puntatori!!) ????

    tu come lo faresti (con le condizioni imposte sopra)??




    Debian Sarge 3.01a
    Slackware 10.2

  9. #9
    Trova il primo negativo da sinistra.
    Trova il primo positivo da destra.
    Scambiali.
    Ricomincia.
    Continua fino a che i due puntatori "si incontrano".

    In Java e senza puntatori:

    codice:
        public static void positiviNegativi(int v[],int dim){
            int p1 = 0;
            // In Java non serve passare dim, ma l'ho fatto per chiarezza
            int p2 = dim-1;
            int app=0;
            while (p1!=p2) {
                while ( (v[p1]>=0) && (p1!=p2))
                    p1++;
                while ( (v[p2]<=0) && (p1!=p2))
                    p2--;
                app = v[p1];
                v[p1] = v[p2];
                v[p2] = app;
            }
        }
    La condizione p1!=p2 e' la condizione di uscita dal ciclo, e va testata anche nei sottocicli. Appena p1==p2 bisogna interrompere.
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  10. #10
    Utente di HTML.it L'avatar di Fabiuz
    Registrato dal
    Nov 2004
    Messaggi
    892
    ma questo in Java funge??
    Debian Sarge 3.01a
    Slackware 10.2

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.