Kreiranje boja – RGB vrednost – rešenje

Tekst zadatka

Poznato je da se svaka nijansa boje može dobiti mešanjem tri komponente: crvene, zelene i plave. Komponente su predstavljene sa tri cela broja čije su vrednosti od 0 do 255. To je RGB vrednost. Napisati program koji za učitane vrednosti R, G i B određuje koja nijansa boje preovlađuje.

Ulaz

Sa standardnog ulaza unose se tri cela broja, svaki u posebnom redu, koji predstavljaju R, G i B vrednosti u opsegu od 0 do 255.

Izlaz

Na standardni izlaz ispisati naziv boje koja dominira. Ako dve komponente imaju jednaku najveću vrednost, ispisuje se da dominira njihova mešavina. Ako su sve tri komponente jednake, ispisuje se da su sve boje jednako zastupljene.

Primer

Ulaz:

50
130
170

Izlaz:

Plava

Objašnjenje rešenja

RGB je skraćenica od naziva tri osnovne svetlosne komponente: R – crvena (red), G – zelena (green) i B – plava (blue). Svaka komponenta je ceo broj od 0 do 255. U ovom zadatku određujemo koja komponenta ima najveću vrednost.

Najpre učitavamo tri broja pomoću funkcije scanf. Zatim pomoću niza if–else if–else uslova poređujemo komponente:

  • Ako je R veće i od G i od B, preovlađuje crvena boja.
  • Ako je G veće i od R i od B, preovlađuje zelena boja.
  • Ako je B veće i od R i od G, preovlađuje plava boja.
  • Ako su dve komponente jednake i veće od treće, najveću zastupljenost imaju te dve komponente, pa se ispisuje njihova mešavina.
  • Ako su R, G i B jednaki, sve tri komponente su jednako zastupljene.

Važno je da uslovi za jednu dominantnu boju koriste operator >, a ne >=. Kada bi, na primer, R i G imali istu najveću vrednost, uslov za crvenu ili zelenu pojedinačno ne bi bio tačan. Program tada prelazi na uslove koji proveravaju izjednačenje komponenti.

Pre poređenja proveravamo da li je unos uspešno učitan i da li se sve tri vrednosti nalaze u dozvoljenom opsegu od 0 do 255.


Rešenje u programskom jeziku C

#include <stdio.h>

int main(void)
{
    int R, G, B;

    printf("Unesite R, G i B vrednosti (0-255):\n");

    // Ucitavanje tri RGB komponente
    if (scanf("%d%d%d", &R, &G, &B) != 3) {
        printf("Neispravan unos.\n");
        return 1;
    }

    // Provera da li su komponente u dozvoljenom opsegu
    if (R < 0 || R > 255 ||
        G < 0 || G > 255 ||
        B < 0 || B > 255) {
        printf("RGB vrednosti moraju biti od 0 do 255.\n");
        return 1;
    }

    // Provera da li je jedna komponenta strogo veca od ostalih
    if (R > G && R > B) {
        printf("Crvena\n");
    }
    else if (G > R && G > B) {
        printf("Zelena\n");
    }
    else if (B > R && B > G) {
        printf("Plava\n");
    }
    // Dve komponente imaju istu najvecu vrednost
    else if (R == G && R > B) {
        printf("Mesavina crvene i zelene\n");
    }
    else if (R == B && R > G) {
        printf("Mesavina crvene i plave\n");
    }
    else if (G == B && G > R) {
        printf("Mesavina zelene i plave\n");
    }
    // Ako nijedan par nije veci od trece komponente, sve tri su jednake
    else {
        printf("Sve tri boje su jednako zastupljene\n");
    }

    return 0;
}

Dodatni primeri

Primer 1 – Preovlađuje plava

Ulaz:

50
130
170

Izlaz:

Plava

Pošto je 170 veće i od 50 i od 130, plava komponenta ima najveću vrednost.

Primer 2 – Dve komponente su izjednačene na maksimumu

Ulaz:

200
200
80

Izlaz:

Mesavina crvene i zelene

Crvena i zelena komponenta imaju vrednost 200, a plava 80, pa su crvena i zelena jednako zastupljene i obe su veće od plave.

Primer 3 – Sve tri komponente su jednake

Ulaz:

120
120
120

Izlaz:

Sve tri boje su jednako zastupljene

Nijedna komponenta ne dominira, jer su R, G i B jednake vrednosti.


Veza sa sličnim zadacima

Ovaj zadatak je sličan zadatku određivanja najveće vrednosti među tri broja. Razlika je u tome što ovde moramo da obradimo i slučajeve kada dve ili sve tri vrednosti imaju isti maksimum.