Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: C++ vettore

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    33

    C++ vettore

    Salve a tutti ho questo problema che non so come risolvere , vi sarei grato se qualcuno mi aiutassi.
    il problema dice cosi:

    Si scriva un programma che riceve un array di interi A e ristituisce un array di interi i cui valori sono una espansione del contenuto di A effettuata in modo tale da preservarne la somma degli elementi .In particolare ogni valore positivo di A deve essere sostituito con una sequenza equivalente di 1, mentre ognivalore negativo con -1 .Gli eventuali elementi di valore 0 non devono essere considerati durante la espansione
    Esempio:

    A=[-2,0,2,-3,0,2,-4] dovra ristituire : [-1, -1 , 1, 1 ,-1, -1, -1, 1 , 1 , -1 , -1, -1 , -1]

    l'unica condizione che mi viene è quella del inizio:

    codice:
    for (int i=0; i<n; i++)
    {
          if (a[i] != 0 && a[i] < 0) // per i numeri negativi e diversi da 0
          {
                 a[i]=-1;
         }
    }

    grazie dell'aiuto

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    La prima cosa che mi è venuta in mente è questa:
    codice:
    void espandiArray(int vect[], int length) {
      int sum=0;
      for(int i=0; i<length; i++) {
        sum += abs(vect[i]);
      }
      int array[sum];
      int index = 0;
      
      // effettua l'espansione
      for(int i=0; i<length; i++) {
        int n = vect[i];
        if(n < 0) {
          while(n != 0) {
            array[index] = -1;
            n++;
            index++;
          }
        }
        else if(n > 0) {
          while(n != 0) {
            array[index] = 1;
            n--;
            index++;
          }
        }
      }
      
      cout << "[";
      for(int i=0; i<index; i++) {
        cout << array[i] << ",";
      }
      cout << "]";
    }
    Scusa ma non conosco bene C++, mi ricordo poco...sistemala tu se vuoi farla tornare al chiamante

    Il funzionamento è molto semplice: la funzione abs() restituisce il valore assoluto del numero, e la utilizzo per sommare tutti gli elementi (la somma mi serve per avere la dimensione dell'array espanso). E poi inizio semplicemente il calcolo, per ogni valore ciclo N volte.

    Ci sono sicuramente soluzioni migliori, ma come ho detto è la prima che mi è venuta in mente.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    33
    Innanzitutto grazie dall' aiuto, il fatto è che non capisco la parte del codice dove dici :sum += abs (a[i]);,,,,, quel abs mi ha spiazzato totalmente, fra l'altro non è dichiarato da nessuna parte.

    se me lo potresti spiegare sarebbe di gran aiuto

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Certo!

    abs() è una funzione matematica, la trovi in cstdlib ( http://www.cplusplus.com/reference/c...y/cstdlib/abs/ ).
    Questa funzione la utilizzo per avere il valore assoluto, in modo da poterlo sommare; se effettuo la somma di tutto l'array i numeri negativi finirebbero per "sballare" la somma, ma visto che occupano spazio anche loro nell'array e devo sapere quanti scriverne sono costretto a fare in questo modo.
    Volendo potresti anche utilizzare un if..ma dovresti scomodare un costrutto ed effettuare sempre un controllo se questo è < 0; se lo è puoi (ad esempio) effettuare il complemento a 2 del numero (ottenendo lo stesso numero ma con segno positivo) e poi sommarlo.

    "sum += abs(vect[i]);" quel += è semplicemente la forma abbreviata dell'addizione (ovviamente esiste per le altre operazioni anche). Sarebbe come scrivere "sum = sum + abs(vect[i])", in pratica eviti di ripetere l'operando

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    33
    OK, si si sapevo come funzionava la parte del sum, l'unico problema era che ignoravo la funzione abs.
    grazie infinite

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    33
    Purtroppo devo dire che l'ho compilato ma non stampa nulla soltanto quelle parentesi quadre
    quiza ce qualche errore ..... ho comunque messo la libreria cstdlib per vedere come funzionava abs,, ma ti ripeto da problemi con la stampa..
    grazie

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ciao,

    Io utilizzo questo codice:
    codice:
    #include<cstdlib>
    #include<iostream>
    
    using namespace std;
    
    void espandiArray(int vect[], int length) {
      int sum=0;
      for(int i=0; i<length; i++) {
        sum += abs(vect[i]);
      }
      int array[sum];
      int index = 0;
      
      // effettua l'espansione
      for(int i=0; i<length; i++) {
        int n = vect[i];
        if(n < 0) {
          while(n != 0) {
            array[index] = -1;
            n++;
            index++;
          }
        }
        else if(n > 0) {
          while(n != 0) {
            array[index] = 1;
            n--;
            index++;
          }
        }
      }
      
      cout << "[";
      for(int i=0; i<index; i++) {
        cout << array[i] << ",";
      }
      cout << "]";
    }
    
    int main() {
      int vect[] = {-2,0,1,0,3,2,-5};
      espandiArray(vect,7);
      return 0;
    }
    e funziona senza problemi... questo è l'output della versione attuale:
    codice:
    [-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,]

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    33
    grazie davvero per il tuo aiuto

  9. #9
    Purtroppo devo dire che l'ho compilato ma non stampa nulla soltanto quelle parentesi quadre
    good

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Con cosa hai compilato? e su che SO ti trovi?

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