Calculul generic corect al axei graficului de bare [duplicat] (Programare, Algoritm)

Emmanuel Ay a intrebat.
a intrebat.

Există o modalitate generică fiabilă de calculare a axelor graficelor de bare?Caut un algoritm care ar trebui să rotunjească la următorul număr „adecvat”.

În graficul de bare de mai jos, axa y este 0 – 300 cu un pas de succesiune de 75

Mă gândesc că acest algoritm ar trebui să accepte o matrice de numere și:

a) să determine min/max (în acest caz 25 și 250)

b) să determine maximul „adecvat” (în acest caz 300)

Dacă min/max a fost 25/240 – maximul „adecvat” ar fi 250. Orice valoare peste 250 ar duce la un maxim „adecvat” de 300.

Caut o modalitate inteligentă de a rotunji un număr arbitrar.

Aveți vreo idee?

Comentarii

  • Explicați mai exact ce înțelegeți prin „axe de grafic de bare”, „număr adecvat” și „valoarea maximă a axei din dreapta”. –  > Por nbro.
  • Probabil că este cea mai bună practică să nu aveți axa y în multipli de 75. De obicei, ticurile axei sunt în multipli de 1, 2, 2,5 sau 5 ori o putere de 10 –  > Por c2huc2hu.
  • Căutați unele implementări ale articolului lui Paul Heckbert „Nice numbers fir graph labels” –  > Por MBo.
1 răspunsuri
displayName

Voi adăuga deja aici că ieșirea pentru 225 va fi 230 din acest algoritm și nu 300 cum a cerut OP. Motivul: Implementarea mea este în acest fel. Nu prea există un răspuns corect la această întrebare. Mai mult decât codarea, aceasta este o întrebare de proiectare.


Idee: Folosiți o hartă de la int la int, astfel încât, dacă cheia este un număr, atunci valoarea este ceea ce ar trebui adăugat la acesta pentru a obține numărul corespunzător. Extrageți cifrele de intrare de la capătul din dreapta și continuați să îmbunătățiți numărul de la capătul drept al acestuia, îndreptându-vă spre stânga, câte o cifră pe rând.


Harta (să o numim aditivă) ar avea {cheie, valoare} perechi de genul:

{1, 9}, {2, 8}, … , {9, 1}, {20, 0}, …, {90, 10}, …

Rețineți că nu este necesar să adăugați fiecare număr întreg la acesta. Adăugarea doar a câtorva numere întregi ar fi suficientă, dacă utilizați corect harta.

Iată codul/pseudocod pentru a obține valoarea corectă din numărul de intrare:

int GetProperNumber(int input) {
    //Init a variable to keep track of the sign
    int multiplier = 1;

    //For negative numbers, taking some precaution...
    if (input < 0) {
        input *= -1;
        multiplier *= -1;
    }

    //For cases where the input number is only 1 or 2 digits, some quick checks...
    int numberOfDigits = GetNumberOfDigitsInInput(input);
    if (numberOfDigits == 1) return (input + additive[input]) * multiplier;
    if (numberOfDigits == 2) return (input + additive[input - input/10]) * multiplier;

    //Now, coming to the core of the method
    int divisor = 10; //We'll use it to get the left part from the input
    while (true) {

        //First, get right part of the number
        int inputWithDigitsRemoved = input / divisor;

        //If the leftover part is too small, i.e. we have reached the last digit,
        //then break as we have now rounded the number off pretty well.
        if (inputWithDigitsRemoved <= 9) break;

        int inputWithDigitsMasked = inputWithDigitsRemoved * divisor;
        int right = input - inputWithDigitsMasked;

        //Since the number is still not rounded to the right magnitude, 
        //the result should be further improved.
        if (additive.Contains(right)) input += additive[right];
        divisor *= 10;
    }
    return input * multiplier;
}

Un exemplu de rezultat ar fi:

Input = 5, Output = 10

Intrare = 99, ieșire = 100

Intrare = 2541, ieșire = 2600