Trovare il numero più vicino

di il
13 risposte

Trovare il numero più vicino

Ciao a tutti,
dato un range variabile di numeri, ad esempio 7, 9, 24, 89,
come faccio a creare una funzione che calcoli quale di questi valori è più vicino al valore passato nella funzione, senza mai superarlo?
In questo caso, se passo alla funzione il valore 8, mi dovrebbe restituire il 2° valore, ossia 9.
Grazie

13 Risposte

  • Re: Trovare il numero più vicino

    Basta una firme qualche if con una sottrazione... impossibile non riuscirci o non provarci...
  • Re: Trovare il numero più vicino

    Io non me la so vedere tutto in una funzione. Ma:
    1. Calcoli tutte le SOTTRAZIONI
    2. Escludi i risultati < 0
    3. Prendi il Min della serie di sottrazioni "valide".
  • Re: Trovare il numero più vicino

    OsvaldoLaviosa ha scritto:


    Io non me la so vedere tutto in una funzione. Ma:
    1. Calcoli tutte le SOTTRAZIONI
    2. Escludi i risultati < 0
    3. Prendi il Min della serie di sottrazioni "valide".
    Perche i risultati <0 ti schifano...?
    Se fai una sottrazione devi mettere in conto che il risultato possa essere negativo... se ad esempio il numero iniziale fosse 10 dati i numeri suggeriti inizialmente avresti 2 positivi e 2 negativi.
    Quindi nella realtà interessando la distanza in valore assoluto non si scartano ma si considera senza segno... ABS(...)

    Si fa tutto in pochissime righe, se l'origine fosse un array, cosa non chiarita, un ciclo di 3 righe farebbe tutto.
    In ogni iterazione si legge la distanza e se minore della precedente si memorizza distanza ed indice array o Numero.
    Finiti i numeri si rimane con il più vicino... stessa tecnica per cercare il più alto o il più basso in una serie.
  • Re: Trovare il numero più vicino

    @Alex ha scritto:


    Perche i risultati <0 ti schifano...?
    Perché paccatore vuole così

    paccatore ha scritto:


    dato un range variabile di numeri, ad esempio 7, 9, 24, 89,
    funzione che calcoli quale di questi valori è più vicino al valore passato nella funzione, senza mai superarlo.
    In questo caso, se passo alla funzione il valore 8, mi dovrebbe restituire il 2° valore, ossia 9.
  • Re: Trovare il numero più vicino

    OsvaldoLaviosa" post_id="8642845" time="1581967922 ha scritto:


    Perché paccatore vuole così
    No lui ha fatto un esempio peraltro in contraddizione con quello che chiede... passa 8 e dice che deve dare 9 ma senza mai superare 8 è il contrario... dovrebbe dare 7... a meno non intenda il valore dell'indice dell'array e non il valore del numero... che rimetterebbe in discussione i negativi ma richiederebbe una leggera modifica... sperando pure sull'ordine dei numeri nella serie... che casualmente o meno nell'esempio sono crescenti.
    Questo giusto per correttezza e per farti capire che si può interpretare.

    Chi sviluppa con più cognizione deve avere la capacità di capire meglio l'eventuale carenza progettuale.
    Non tutti ovviamente hanno coerenti capacità logiche progettuali per funzioni, spesso per carenza di concetti tecnici, quindi per non dare suggerimenti altrettanto limitati possiamo limitarci nel dare qualsiasi suggerimenti ci venga in mente e curare meglio quello che si eroga.
    I suggerimenti si danno pochi ma buoni non tanto per far numero.
  • Re: Trovare il numero più vicino

    paccatore ha scritto:


    dato un range variabile di numeri, ad esempio 7, 9, 24, 89
    Questo è il punto di partenza.

    paccatore ha scritto:


    funzione che calcoli quale di questi valori è più vicino al valore passato nella funzione, senza mai superarlo.
    Questa frase appare confusa e/o contraddittoria.

    paccatore ha scritto:


    In questo caso, se passo alla funzione il valore 8, mi dovrebbe restituire il 2° valore, ossia 9.
    Questa frase (almeno a me...nonostante la mia nota cocciutaggine) chiarisce ogni equivoco.
    Il valore 8 supera il 7 che quindi viene escluso.
    7-8=-1 (7 valore da escludere)
    9-8=1
    24-8=16
    89-8=81
    Di tutti gli altri positivi, prendere il Min.

    Se c'è ancora confusione/ambiguità, paccatore chiarirà
  • Re: Trovare il numero più vicino

    L'italiano non è interpretabile... ripeto che ha chiesto una cosa contraddittoria in modo non equivocabile... quindi prima di tutto aspetterei chiarisse... in ogni caso... se fosse UGUALE... distanza zero...? Troppo vicino lo scartiamo...?
    Diciamo che se l'esempio facesse testo mancherebbero ugualmente condizioni... ma forse il minimo superiore potrebbe essere giusto... e sempre 3 righe di codice servono.
  • Re: Trovare il numero più vicino

    Buongiorno ragazzi,
    innanzitutto vi voglio ringraziare per il tempo dedicato, vi dico solo che stanotte nel sonno ho avuto l'illuminazione, quindi stamattina pensavo di modificare il post prima che qualcuno mi rispondesse, anche perché in realtà la questione è un po più complessa della domanda formulata in maniera frettolosa, ma la vs. operosità mi ha davvero colpito!
    L'esigenza che ho è quella di scrivere una funzione che ragioni come un magazziniere che deve registrare un carico di magazzino e che quindi va a cercarsi le righe d'ordine fornitore da evadere, cercando di lasciare meno spezzature possibili; nello specifico il problema si pone quando nell'ordine sono presenti più righe con lo stesso codice, ma nell'automatismo che sto creando il sistema gestionale vuole sapere con esattezza quale riga deve evadere, però per fare questo penso sia meglio calcolarsi un indice di priorità di evasione...
    Esempio:

    Bolla del fornitore Rif Vs. Ordine 5.88
    CodArt | Qtà
    MELE | 6
    PERE | 24

    Ordine a fornitore 5.88
    Idriga | CodArt | Qtà BackOrder | Priorità evasione
    01 | MELE | 6 | 1 > e qui sono = quindi no problem, salda questa
    06 | PERE | 14 | 1 > qui deve evadere sia questa riga che la riga 66
    58 | MELE | 48 | 3 > se la riga 1 e 84 sono evase, evade 1 pz qui e 5 pz sulla riga 93
    66 | PERE | 10 | 1 > qui deve evadere sia questa riga che la riga 6
    84 | MELE | 7 | 2 > se la riga 1 è evasa, evade 6 pz da qui, lasciando 1 in backorder
    93 | MELE | 5 | 3 > se la riga 1 e 84 sono evase, evade questa riga e 1 pz sulla riga 58

    Quindi la funzione che dovrò scrivere, qualcosa del tipo GetRowToProcess(IDordine, CodiceArticolo, QtaSpedita) penso che sarà suddivisa in 3 parti, la 1° se sono uguali, la 2° per gli interi (caso delle MELE), la 3° per le spezzature (caso delle PERE), e questa funzione restituirà per ogni combinazione passata l'IDriga o gli IDriga da evadere con le relative quantità.
    Spero di essermi spiegato meglio, appena posso provo a buttar giù qualcosa e vi aggiorno...
    Voi gestireste questa problematica in maniera più semplice? Come?
    Grazie
  • Re: Trovare il numero più vicino

    TI rendi conto che questo problema con quello che hai posto inizialmente non ha veramente NULLA a che fare....?
    Tu vuoi un sistema di ottimizzatore ordini... allora lasciamo ad Osvaldo darti la sua visione della soluzione, tanto non dovendo farla può dire la sua e poi sostenerla in astratto.

    P.S. tutto è fattibile... ma questo richiede un poco di codice da scrivere... significa che ci devi dire dove trovi probelma... altrimenti significa scriverti una soluzione, cosa che non sarà gestibile.
    In linea di principio devi avere l'esecuzione delle ottimizzazioni alla fine dell'elenco e non riga per riga... perchè così saresti costretto a fare N volte quante solo le righe lo stesso processo essendo nella realtà tutti legati in base alla logica di esecuzione...!
    Quindi devi prendere una volta sola tutti i dati, ordinarli in modo da dare la PRIORITA' di evazione con la tua logica... e da li scalare il quantitativo disponibile e proseguire il ciclo sugli ordini di quel CODART, finchè non hai esaurito la giacenza o finchè non hai terminato gli ordini...

    Quindi una logica di come poter approciare è quella che ti ho indicato.

    Non è una cosa complessa... ma non è immediata.
    Se non hai dimestichezza con il VBA non riuscirai a fare nulla... al contrario se sai come muoverti prova a imbastire una tua idea di Funzione e poi vediamo come ottimizzarla la dove hai un problema specifico.
  • Re: Trovare il numero più vicino

    @Alex ha scritto:


    allora lasciamo ad Osvaldo darti la sua visione della soluzione
    No, mi arrendo. Troppi calcoli in gioco.
  • Re: Trovare il numero più vicino

    OsvaldoLaviosa ha scritto:


    @Alex ha scritto:


    allora lasciamo ad Osvaldo darti la sua visione della soluzione
    No, mi arrendo. Troppi calcoli in gioco.
    Speriamo insegni per la prossima volta...
  • Re: Trovare il numero più vicino

    Scusa Alex, non ho capito cosa intendi, potresti spiegarti meglio con un esempio?
    "In linea di principio devi avere l'esecuzione delle ottimizzazioni alla fine dell'elenco e non riga per riga"
    Grazie
  • Re: Trovare il numero più vicino

    Che puoi ottimizzare solo quando hai inserito la distinta base... e poi dovresti chiudere o inibire l'algoritmo...
Devi accedere o registrarti per scrivere nel forum
13 risposte