Un piccolo studente che ha bisogno di una grande mano...

di il
51 risposte

51 Risposte - Pagina 2

  • Re: Un piccolo studente che ha bisogno di una grande mano...

    So di essere stupido, però tre ore sopra sto fondendo.

    Credo di essere riuscito a fare lo scambio.
    
    
    int main ()
    {
       int N = 6;
       int a [N];
       int box;
       cout << "Gli elementi dell'array sono: " << endl;
       for (int i = 0; i < N; i++)
       {
          cin >> a [i];
       }
       
       cout << "La nuova serie e': " << endl;
       for (int i = 0; i < 3; i++)
       {
       N = N - 1;
       box = a [i];
       a [i] = a [N];
       box = a [i];
       cout << a [i] << endl;
    }
    return 0;
    }
    
    Fantastico, ragiono un attimo.
    Situazione iniziale:
    - Posizione 0: 1,
    - Posizione 1: 2,
    - Posizione 2: 3,
    - Posizione 3: 4,
    - Posizione 4: 5,
    - Posizione 5: 6.

    Primo scambio.
    Situazione:
    - Posizione 0: 6,
    - Posizione 1: 2,
    - Posizione 2: 3,
    - Posizione 3: 4,
    - Posizione 4: 5,
    - Posizione 5: 1.

    Secondo scambio.
    Situazione:
    - Posizione 0: 6,
    - Posizione 1: 5,
    - Posizione 2: 3,
    - Posizione 3: 4,
    - Posizione 4: 2,
    - Posizione 5: 1.

    Terzo scambio.
    Situazione:
    - Posizione 0: 6,
    - Posizione 1: 5,
    - Posizione 2: 4,
    - Posizione 3: 3,
    - Posizione 4: 2,
    - Posizione 5: 1.

    Io ho stampato da posizione 0 a posizione 2.
    Adesso dovrei semplicemente usare un for:
    
    for (int i = 3, i <=5; i++)
    { cout << a [i] << endl;
    }
    
    Per stampare i numeri mancanti.
    Ma non me li stampa.
    Secondo me ci sta qualcosa di sbagliato nel for di prima, magari quando ho posto N = N-1, non so.
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    SEMPLIFICA ANCORA: invece di 6 elementi, fallo con 2, poi con 3.
    QUINDI con 4 e 5

    CONTROLLA BENE QUELLO CHE HAI SCRITTO: hai scritto UNA CASTRONATA!

    NO, NON SEI RIUSCITO A FARE LO SCAMBIO

    --

    EVITA DI INSERIRE I DATI DA TASTIERA: perdi solo tempo.

    Inizia come hai fatto, con i vettori [0,1], [0,1,2], [0,1,2,3] e [0,1,2,3,4]

    Quando funzionera', provalo con 10/20/50 elementi (e ti voglio vedere inserire 50 valori sai che ball...e )

    NON FISSARTI sul numero di ore che stai dedicando per risolvere un esercizio semplice: una volta capito, la prossima volta starai 30 secondi.

    NON PENSARE che un esperto non perda ORE o GIORNI (o SETTIMANE) per implementare un NUOVO algoritmo!

    Certo, il TUO algoritmo lo implementa in 1 millisecondo, ma solo perche' lo ha gia' fatto UN MILIONE di volte.

    La PRIMA VOLTA e' complicata per TUTTI (in QUALUNQUE CONTESTO )
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Hai ragione, proverò con meno elementi nell'array, per poi man mano aumentare...
    Ero convinto che con il codice che segue fossero invertiti, alla fine a me stampa se inizialmente 1 2 3 4 5 6 ---> 6 5 4. :O
    
    
    #include <iostream>
    using namespace std;
    int main ()
    {
       int N = 6;
       int a [N];
       int box;
       cout << "Gli elementi dell'array sono: " << endl;
       for (int i = 0; i < N; i++)
       {
          cin >> a [i];
       }
       
       cout << "La nuova serie e': " << endl;
       for (int i = 0; i < 3; i++)
       {
       N = N - 1;
       box = a [i];
       a [i] = a [N];
       box = a [i];
       cout << a [i] << endl;
    }
    return 0;
    }
    
    
    Forse è meglio riguardarlo domattina con mente fresca...
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Per risparmiare un bel po' di tempo mentre fai le prove, perché non segui il consiglio di Migliorabile di PREIMPOSTARE l'array dei valori da invertire? Ti eviti di riscrivere i dati ad ogni "esperimento"...
    #include <iostream>
    using namespace std;
    int main ()
    {
    /*  questa parte del codice ti fa perdere un sacco di tempo
        potresti preimpostare a[] fin dalla sua dichiarazione,
        invece di immettere i valori ogni volta da tastiera...
        
        int N = 6;
        int a [N];
        int box;
    
        cout << "Gli elementi dell'array sono: " << endl;
        for (int i = 0; i < N; i++)
        {
            cin >> a [i];
        }
    */
        int N = 6;
        int a[N] = { 1,2,3,4,5,6 }; // a[] viene riempito di botto con i sei valori
        int box;
       
        cout << "La nuova serie e': " << endl;
        for (int i = 0; i < 3; i++)
        {
            N = N - 1;
            box = a [i];
            a [i] = a [N];
            box = a [i];
            cout << a [i] << endl;
        }
    
        return 0;
    }
    Migliorabile, la sintassi del for con le istruzioni multiple di inizializzazione e incremento non l'ho tirata fuori io, era in una delle domande che ci ha posto Luggigi -- io ho tentato di aiutarlo a capire di cosa si trattasse.

    P.S. Gli esercizi scritti in italiacano esistono, eccome! Sono quelli di fronte ai quali chi deve svolgerli passa venti minuti a cercare di capire quali delle n interpretazioni possibili (a fronte di un uso non univoco della lingua italiana) è quella che più probabilmente combacia con quel che aveva in mente l'autore, poi cinque minuti a risolvere l'esercizio sperando d'aver indovinato le intenzioni dell'autore stesso. Ho solo riportato un fenomeno che ho osservato, nei riguardi quale non ho nè meriti nè colpe -- se ci si bagna la testa è colpa della pioggia, non di chi dice che sta piovendo.
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Buongiorno, finalmente ci sono riuscito: ho solo un dubbio.
    
    
    #include <iostream>
    using namespace std;
    int main ()
    {
    
        int N = 6;
        int a[N] = { 1,2,3,4,5,6 }; // a[] viene riempito di botto con i sei valori
        int box;
       
        cout << "La nuova serie e': " << endl;
        for (int i = 0; i < 3; i++)
        {
            N = N - 1;
            box = a [i];
            a [i] = a [N];
            a [N] = box;
            cout << a [i] << endl;
        }
        for (int i = 3; i <= 5; i++)
       { cout << a [i] << endl;
    }
        return 0;
    }
    
    
    Avevo sbagliato il primo for...
    Il secondo for funziona se scritto come:
    for (int i = 3; i <= 5 (che sarebbe N-1 ma N-1 non lo prende); i++.
    Che buongiorno ahahaah
    Dopo dovrei scriverlo in modo più "impreciso", facendo scegliere all'utente la dimensione dell'array e i valori da inserirvi...
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Secondo me l'origine dell'esigenza che hai incontrato di mettere dei valori fissi al posto delle variabili sta nel fatto che modifichi N, perdendo l'informazione originale (cioè le dimensioni dell'array). A quel punto sei costretto a "fare le capriole" senza una vera necessità...
    #include <iostream>
    using namespace std;
    
    int main ()
    {
        int N = 6;
        int a[N] = { 1,2,3,4,5,6 };
        int box;
    
        /*
        // non che sia necessario ma, volendo, per "fare
        // il figo" potresti cominciare col mostrare il
        // contenuto originale dell'array
    
        cout << "La serie originale e': " << endl;
    
        for (int i = 0; i < N; i++)
        {
            cout << a [i] << endl;
        }
        */
    
        cout << "\nLa nuova serie e': " << endl;
    
        for (int i = 0; i < N/2; i++)   // se usi 3 invece di N/2 sei vincolato
        {                               // al caso particolare nel quale N==6
    
            // N = N - 1;               // modificando N perdi l'informazione sulla
                                        // quantita' dei valori nell'array
            box = a [i];
            a [i] = a [N-1-i];          // con N-1-i aggiorni l'indice "al volo",
            a [N-1-i] = box;            // portandoti sul valore dell'array che ha
                                        // posizione "simmetrica" rispetto al centro
                                        // (prova a fare il calcolo per vedere cosa
                                        // succede man mano che incrementi i, con N
                                        // costante)
    
            // cout << a [i] << endl;   // quest'istruzione puoi lasciarla perdere
                                        // per poi mostrare tutto l'array d'un botto
                                        // nel prossimo for
        }
    
        for (int i = 0; i < N; i++)     // in questo for, avendo conservato il
        {                               // valore di N, puoi mostrare d'un colpo
            cout << a [i] << endl;      // l'intero array dopo la modifica
        }
    
        return 0;
    }
    Da qui, adattare il codice a una dimensione qualsiasi dell'array è solo questione di modificare il valore iniziale di N e l'inizializzazione dell'array.
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Ci sono riuscito, ho capito anche che modificando N perdevo l'informazione sulla dimensione dell'array.
    Fantastico, sono contentissimo.
    Torno a fare programmi, la notte è ancora lunga.

    Mi sa che d'ora in poi comincio a guardare un po' di più passaggio per riferimento, matrici, puntatori.
    Se nel resto da 1 a 10 sono 0.1, in questi tre argomenti sono meno di 0. :/
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Fare queste cose è divertente. Certo è che avendo obblighi e scadenze, come nel caso dei tuoi esami, lo è un po' meno... Con obblighi e scadenze anche mangiare cioccolatini, pistacchi o pizze diventa odioso.
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    AldoBaldo ha scritto:


    Fare queste cose è divertente. Certo è che avendo obblighi e scadenze, come nel caso dei tuoi esami, lo è un po' meno... Con obblighi e scadenze anche mangiare cioccolatini, pistacchi o pizze diventa odioso.
    Diciamo che tra analisi e chimica generale non è proprio il massimo cercare di imparare a fare queste cose, che le reputo forse anche più difficili e più lontane alla mia preparazione.
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Buon anno a tutti!
    Stavo provando a fare:
    // Ricevere in input due array di interi con le relative dimensioni e determini
    // se la somma degli elementi del più piccolo è contenuto nel più grande.
    
    
    #include <iostream>
    using namespace std;
    int main ()
    {
    	cout << "Inserisci la dimensione del primo array: ";
    	cin >> x;
    	cout << "Inserisci la dimensione del secondo array: ";
    	cin >> y;
    	int a [x];
    	int b [y];  
    	int min;
            int somma1  = 0, somma2 = 0;
            cout << "Inserisci interi nel primo array: " << endl;
    	for (int i = 0; i < x; i++)
    	{
    		cin >> a [i];
    		somma1 = somma1 + a [i];
    	}
    	cout << "Inserisci interi nel secondo array: " << endl;
    	for (int i = 0; i < y; i++)
    	{
    		cin >> b [i];
    		somma2 = somma2 + b [i];
    	}
    	
    	if (somma1>somma2)
    	min = somma2;
    	else if (somma2>somma1)
    	min = somma1;
    	else if (somma1==somma2)
    	min = somma1;
    		
    }
    
    Penso chieda di cercare se "il valore" della somma minore (min) sia contenuto nell'array più grande, sia un elemento della dimensione dell'array.
    Non so come impostare ciò, sicuramente con un for e un if però non saprei proprio...
    Aiuti?
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Prima di pensare all'algoritmo risolutivo, e quindi al codice, bisogna avere ben chiaro quale sia il problema che si vuole risolvere.

    Detto questo trovo sia la traccia che la tua interpretazione parecchio ambigue! Magari è un mio limite, ma se non capisco quello che stai cercando di fare non saprei davvero come aiutarti!
    Magari un esempio potrebbe essere utile in questo caso.
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Nippolo ha scritto:


    Prima di pensare all'algoritmo risolutivo, e quindi al codice, bisogna avere ben chiaro quale sia il problema che si vuole risolvere.

    Detto questo trovo sia la traccia che la tua interpretazione parecchio ambigue! Magari è un mio limite, ma se non capisco quello che stai cercando di fare non saprei davvero come aiutarti!
    Magari un esempio potrebbe essere utile in questo caso.
    Non è un tuo limite, semmai è mio
    Credo che la traccia intenda:
    array 1 {18, 30, 6, 40}
    array 2 {5,1}

    La somma degli elementi del primo array è maggiore rispetto alla somma degli elementi del secondo array (5+1 = 6).
    La somma minore (6) è contenuta nel primo array come elemento.
    O per lo meno io l'ho interpretata così la traccia.
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    In pratica vogliamo scoprire se il vettore con somma maggiore abbia un elemento uguale alla somma degli elementi dell'altro vettore, giusto? =)

    In tal caso però sorge una domanda... come andrebbe gestito il caso in cui le due somme sono uguali?
    Per esempio consideriamo gli array v1={1,2,3} e v2={0,0,6}; le somme sono uguali, ma v2 contiene la somma e v1 no.

    In ogni caso la strada più semplice e senza scomodare i puntatori è la seguente: se somma1>somma2 allora cerchi somma2 tra gli elementi di v1, invece se somma2>somma1 allora cerchi somma1 tra gli elementi di v2.
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Nippolo ha scritto:


    In pratica vogliamo scoprire se il vettore con somma maggiore abbia un elemento uguale alla somma degli elementi dell'altro vettore, giusto? =)

    In tal caso però sorge una domanda... come andrebbe gestito il caso in cui le due somme sono uguali?
    Per esempio consideriamo gli array v1={1,2,3} e v2={0,0,6}; le somme sono uguali, ma v2 contiene la somma e v1 no.

    In ogni caso la strada più semplice e senza scomodare i puntatori è la seguente: se somma1>somma2 allora cerchi somma2 tra gli elementi di v1, invece se somma2>somma1 allora cerchi somma1 tra gli elementi di v2.
    Sui puntatori non sono calzante per mia sfortuna, immagino quindi che bisogna usare la ricerca lineare.
    Magari si adotta una funzione del tipo:
    
    
    bool ricerca_lineare ()
    {
    }
    
    
    E la si prova ad inserire all'interno del main.
    Provo un pochettino, vi aggiornerò.
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Nippolo: "Detto questo trovo sia la traccia che la tua interpretazione parecchio ambigue!"

    Ecco un altro caso di quel che affermavo dicendo che chi scrive esercizi a volte dovrebbe prestare più attenzione alla lingua che usa e al modo di gestirne i significati (a meno che nel testo che ci è stato proposto manchi un pezzo).

    Comunque sia, a parte la formulazione discutibile, "ricevere in input due array di interi con le relative dimensioni e determini se la somma degli elementi del più piccolo è contenuto nel più grande secondo me con "array più piccolo" e "array più grande" intende "array col minor numero di elementi" e "array col maggior numero di elementi". Il che porta a una soluzione completamente diversa da quella che state prospettando.
Devi accedere o registrarti per scrivere nel forum
51 risposte