Kirjautuminen

Haku

Tehtävät

Koodit: C, PHP: Oma vertailu järjestelyssä

Kirjoittaja: Antti Laaksonen

Kirjoitettu: 07.06.2006 – 07.06.2006

Tagit: algoritmit, kirjaston käyttö, koodi näytille, vinkki

Tiedossa on ohjelmointikerhon jäsenten nimet ja iät. Nyt kerholaiset pitää järjestää iän mukaan vanhimmasta nuorimpaan. Jos kaksi jäsentä ovat samanikäisiä, järjestys valitaan kuitenkin nimen mukaan. Monissa ohjelmointikielissä valmiiseen järjestelyfunktioon on mahdollista liittää oma vertailufunktio tällaisen erikoisjärjestelyn toteuttamiseksi.

Tyypillisesti ohjelmointikielen järjestelyfunktio kutsuu omatekoista vertailufunktiota ja antaa sille parametreiksi kaksi taulukon alkiota, joiden keskinäinen järjestys täytyy saada selville sillä järjestelyn hetkellä. Yleisten järjestelyfunktioiden taustalla on juuri kahden taulukon alkion vertailu, vaikka itse järjestelytapoja on lukuisia.

Tässä on esimerkkiohjelmat C:llä (qsort) ja PHP:llä (usort). Molemmissa tapauksissa vertailufunktio palauttaa negatiivisen arvon, jos ensimmäinen parametri kuuluu jälkimmäisen eteen ja positiivisen arvon, jos jälkimmäinen parametri kuuluu ensimmäisen eteen. Palautusarvo nolla tarkoittaa, että parametrien järjestys on määrittelemätön.

C-esimerkki

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct JASEN {
    char nimi[10];
    int ika;
};

int vertailu(const void *a, const void *b) {
    struct JASEN *j1, *j2;
    /* muutetaan osoittimet oikeanmuotoisiksi */
    j1 = (struct JASEN *)a;
    j2 = (struct JASEN *)b;

    /* jos iät ovat samat, vertaillaan nimiä */
    if (j1->ika == j2->ika) {
        return strcmp(j1->nimi, j2->nimi);
    } else {
        return (j2->ika > j1->ika) ? 1 : -1;
    }

}

int main(void) {
    int i;
    struct JASEN kerho[5] = {{"Pekka", 10},
                             {"Tiina", 11},
                             {"Anna", 9},
                             {"Lauri", 10},
                             {"Kalle", 9}};

    /* parametrit: järjesteltävä taulukko
                   alkioiden määrä
                   yhden alkion koko
                   vertailufunktio */
    qsort(kerho, 5, sizeof(struct JASEN), vertailu);

    for (i = 0; i < 5; i++) {
        printf("%s %i\n", kerho[i].nimi, kerho[i].ika);
    }

    return 0;
}

PHP-esimerkki

<?php

function vertailu($a, $b) {
    // jos iät ovat samat, vertaillaan nimiä
    if ($a[1] == $b[1]) {
        return strcmp($a[0], $b[0]);
    } else {
        return ($b[1] > $a[1]) ? 1 : -1;
    }
}

$kerho = array(array("Pekka", 10),
               array("Tiina", 11),
               array("Anna", 9),
               array("Lauri", 10),
               array("Kalle", 9));

usort($kerho, "vertailu");

foreach($kerho as $tiedot) {
    echo $tiedot[0] . " " . $tiedot[1] . "<br>";
}

?>

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta