AIUTO PER ESAME

di il
6 risposte

AIUTO PER ESAME

Ciao! sono nuova del forum, volevo chiedervi, qualcuno riesce a farmi capire come si ragiona su questo tipo di problemi? o magari avete anche qualche trucchetto per quanto riguarda le operazioni che si possono fare su più vettori! ( il main lo so fare, il problema è solo nella prima parte)

Vi posto un'esempio:

Scrivere un algoritmo codificato in linguaggio C/C++ che:
1. definisce la funzione EsisteCoppia con parametri:
• a di tipo vettore di 500 int;
• b di tipo vettore di 100 int;
• c di tipo vettore di 500 int;
• d di tipo puntatore/riferimento ad un int.
Per ogni valore x del vettore a, la funzione deve copiare x nel vettore c solo se esistono almeno due i valori y e z del vettore b tali che y>x e z<x. La funzione deve inoltre scrivere nell’area di memoria puntata/riferita da c il numero di valori copiati.
2. nella funzione main
I. dichiara tre vettori x e y di 500 int e z di 100 int.
II. dichiara una variabile n di tipo int;
III. riempie il vettore x con valori letti da standard input;
IV. ripete le seguenti istruzioni fino a quando l’esecuzione della funzione EsisteCoppia() inserisce in ogni posto del vettore y un valore:
a. riempire il vettore z con valori letti da standard input;
b. eseguire la funzione EsisteCoppia() applicata al vettore x e al vettore z inserendo i risultati nel vettore y e nella variabile n;

6 Risposte

  • Re: AIUTO PER ESAME

    Non c'è un modo particolare di ragionare né, tanto meno, ,trucchetti'. Comincia a scrivere il codice seguendo le specifiche es utilizzando cicli/controlli opportuni. Presenta il codice qui se hai problemi.
  • Re: AIUTO PER ESAME

    Ciao Giulia,
    se ho capito bene, il valore x del vettore a è valido solo se esistono due valori 'z' e 'y' del vettore b tali che z<x e y>x.
    Se sai ordinare un vettore, io procederei così:
    1) Ordina in modo crescente il vettore a ( Quindi avrai un vettore a del tipo [5, 7, 10, 11, 14 ..] )
    2) Ordina in modo crescente il vettore b ( Quindi avrai un vettore a del tipo [2, 8, 12, 13, 19 ..] )
    3) Cicla sul vettore a, per ogni valore x verifica il numero più piccolo e poi più grande del vettore b prendendo il valore più piccolo dall'inizio, poi il più grande dalla fine.
    Ad esempio, prendi il x = 5 del vettore a, prendi z = b[0] del vettore b e verifica se z < x, se non è vero, continua a ciclare su a, se è vero continui e prendi y = b[99] del vettore b e verifica se y > x. Se anche questo controllo è vero, allora x è valido e lo aggiungi nel vettore c, poi salvi in d il puntatore all'ultimo valore di c.

    Ordinando i due vettori eviterai di ciclare fino a 500x100 volte i vettori.

    In alternativa a questo metodo, senza usare l'ordinamento:
    1) Cicla sul vettore a, x è il valore corrente nel ciclo di a.
    2) In ogni ciclo inizializza due variabili temporanee di lavoro, z int = 0 e y = 0
    3) Cicla sul vettore b, supponiamo che k sia il valore corrente nel ciclo di b, se k < x e z = 0, allora z = k altrimenti se k > x allora y = k.
    4) Prima di passare al valore k successivo, controlla se sia z che y sono state valorizzate. Se si, puoi interrompere il ciclo e considerare buono x


    Spero di essere stato abbastanza chiaro
  • Re: AIUTO PER ESAME

    Grazie!!
  • Re: AIUTO PER ESAME

    Prego!
    se scegli il secondo metodo, controlla bene l'inizializzazione della variabili 'z' e 'y', non sono sicuro che vada bene impostarle = 0 come ti ho scritto, perchè anche 0 potrebbe essere un numero che trovi all'interno del vettore a.
    Forse null? Non ricordo bene in C come si possono definire le variabili.
  • Re: AIUTO PER ESAME

    Se ho ben capito il tuo problema, per quanto riguarda i valori di y e z, basta che prendi per z il minimo di b e per y il massimo (sempre di b), così non serve scansionare ulteriormente b (non serve ordinarlo, sprechi solo tempo).
    E poi non penso tu debba ordinare il vettore a, perchè se lo fai gli elementi che sposti nel vettore c avranno un ordine diverso, e va contro il principio dellindipendenza dall'implementazione (a parità di input, gli stessi output)
  • Re: AIUTO PER ESAME

    Franzo ha scritto:


    Se ho ben capito il tuo problema, per quanto riguarda i valori di y e z, basta che prendi per z il minimo di b e per y il massimo (sempre di b), così non serve scansionare ulteriormente b (non serve ordinarlo, sprechi solo tempo).
    E poi non penso tu debba ordinare il vettore a, perchè se lo fai gli elementi che sposti nel vettore c avranno un ordine diverso, e va contro il principio dellindipendenza dall'implementazione (a parità di input, gli stessi output)
    Si hai ragione, soprattutto per la correzione al mio suggerimento di ordinare il vettore a.
    Ordinandolo il risultato non è uguale, bisogna vedere com'è esattamente la richiesta, potrebbe anche non interessare l'ordine del vettore c.
Devi accedere o registrarti per scrivere nel forum
6 risposte