Drugi domaći


Niska statistike

Napisati program koji kroz argumente komandne linije dobija nisku i karakter, a zatim ispisuje traženu statistiku: broj pojavljivanja datog karaktera (C), indeks prvog (FF) ili poslednjeg (FL) pojavljivanja datog karaktera. Ukoliko se unese i dodatna opcija ignorecase, tada se ignoriše razlika između malih i velikih slova.

Ulaz

Program se pokreće komandnom linijom oblika

./a.out <op> <c> <str> [ignorecase]

gde je <op> jedna od vrednosti C, FF ili FL, <c> je karakter, a <str> je niska.

Izlaz

Na standardni izlaz ispisati traženu vrednost statistike.

U slučaju greške, na standardni izlaz za greške ispisati -1 i završiti program sa statusom neuspeha (1).

Primer

command line

./a.out C a Abrakadabra

stdout

4

Primer

command line

./a.out C a Abrakadabra ignorecase

stdout

5

Primer

command line

./a.out FF e Kameleon

stdout

3

Primer

command line

./a.out FL e Kameleon

stdout

5

Primer

command line

./a.out FP n Banana

stderr

-1

Filitrirani filmovi

U fajlu čija se putanja prosleđuje kao argument komandne linije nalazi se katalog sa filmovima. Za svaki film je u jednoj liniji dat naslov, godina i ocena, a u sledećoj liniji kratak opis. U fajl filtrirano.txt ispisati naslove filmova koji su izašli date godine i imaju ocenu veću od prosleđene. Filmove ispisati istim redosledom kao što su zadati u katalogu.

Ulaz

Program se pokreće komandnom linijom oblika

./a.out <putanja_do_fajla> <godina> <ocena>

pri čemu je <putanja_do_fajla> putanja do fajla u kom se nalazi katalog, a <godina> i <ocena> su godina i ocena po kojima se filtrira.

Naslov je niska bez belina maksimalne dužine $30$ karaktera, godina je pozitivan ceo broj, a ocena realan broj u intervalu $[0, 10]$.

Izlaz

U fajl filtrirano.txt ispisati, svaki u svom redu, naslove filmova koji ispunjavaju uslove zadatka.

U slučaju greške, na standardni izlaz za greške ispisati -1 i završiti program sa statusom neuspeha (1).

Primer

command line

./a.out katalog.txt 2010 8.0

katalog.txt

Inception 2010 8.8
A mind-bending thriller about dreams within dreams.
Avatar 2010 7.8
A visually stunning sci-fi adventure.
ShutterIsland 2010 8.2
A psychological mystery set on a remote island.
Joker 2019 8.5
An origin story of the infamous Batman villain.
Interstellar 2014 8.6
A journey through space and time to save humanity.

filtrirano.txt

Inception
ShutterIsland

Primer

command line

./a.out filmovi.txt 2012 8.0

filmovi.txt

Inception 2010 8.8
A mind-bending thriller about dreams within dreams.
Avatar 2010 7.8
A visually stunning sci-fi adventure.
ShutterIsland 2010 8.2
A psychological mystery set on a remote island.
Joker 2019 8.5
An origin story of the infamous Batman villain.
Interstellar 2014 8.6
A journey through space and time to save humanity.

filtrirano.txt


Primer

command line

./a.out filmovi.txt 2010 8.0

katalog.txt

Inception 2010 8.8
A mind-bending thriller about dreams within dreams.
Avatar 2010 7.8
A visually stunning sci-fi adventure.
ShutterIsland 2010 8.2
A psychological mystery set on a remote island.
Joker 2019 8.5
An origin story of the infamous Batman villain.
Interstellar 2014 8.6
A journey through space and time to save humanity.

stderr

-1

Objašnjenje

Fajl filmovi.txt ne postoji.

Primer

command line

./a.out filmovi.txt 2010 

filmovi.txt

Inception 2010 8.8
A mind-bending thriller about dreams within dreams.
Avatar 2010 7.8
A visually stunning sci-fi adventure.
ShutterIsland 2010 8.2
A psychological mystery set on a remote island.
Joker 2019 8.5
An origin story of the infamous Batman villain.
Interstellar 2014 8.6
A journey through space and time to save humanity.

stderr

-1

Objašnjenje

Broj argumenata komandne linije nije dobar.


Usamljeni bit

Za bit u zapisu broja kažemo da je usamljen ako se sa obe njegove strane nalaze suprotni bitovi u odnosu na njega. Na primer, u zapisu broja 10011010, usamljeni su bitovi na pozicijama $1$ i $2$ (pozicije se broje od $0$, sa desna na levo).

Napisati program koji ispisuje sve pozicije na kojima se nalaze usamljeni bitovi u zapisu datog neoznačenog celog broja.

Ulaz

Sa standardnog ulaza se učitava neoznačen ceo broj. Podrazumevati da je ulaz ispravno zadat.

Izlaz

Na standardni izlaz ispisati sve pozicije na kojima se nalaze usamljeni bitovi u zapisu datog broja.

Primer

Ulaz

10

Izlaz

1 2 3

Primer

Ulaz

412412

Izlaz

8 9 10 11 14

Primer

Ulaz

12

Izlaz



Rasporedi opseg

Napisati funkciju:

template <typename ForwardIt, typename T>
void rasporedi_opseg(ForwardIt begin, ForwardIt end, const T &value);

koja sve elemente u opsegu [begin, end) jednake prosleđenom parametru value postavlja na početak opsega. Poredak ostalih elemenata treba da ostane nepromenjen. Pretpostaviti da tip na koji pokazuje iterator podržava opeartor==.

Napomena: Dozvoljeno je koristiti pomoćni vektor. Sav studentski kod treba da se nađe u naznačenom delu rešenja.

Ulaz

Sa standardnog ulaza se učitava broj elemenata niza, zatim elementi niza (celi brojevi), zatim broj elemenata niza stringova, zatim elementi niza stringova, zatim broj elemenata niza realnih brojeva i na kraju elementi niza realnih brojeva.

Izlaz

Na standardni izlaz ispisati tri reda. U prvom redu ispisati elemente celobrojnog niza nakon poziva funkcije rasporedi_opseg sa vrednošću 42. U drugom redu ispisati elemente niza stringova nakon poziva funkcije rasporedi_opseg sa vrednošću "Hello". U trećem redu ispisati elemente niza realnih brojeva nakon poziva funkcije rasporedi_opseg sa vrednošću 3.14. Elementi u svakom redu treba da budu razdvojeni jednim razmakom.

Kod

#include <iostream>
#include <vector>

namespace matf {

	template <typename ForwardIt, typename T>
	void rasporedi_opseg(ForwardIt begin, ForwardIt end, const T &value)
    {
        //Vas kod ide ovde
    }

} // namespace matf

int main(void)
{
    int n;
    std::cin >> n;

	std::vector<int> vec(n);
    for(int i = 0; i < n; i++)
        std::cin >> vec[i];
	matf::rasporedi_opseg(vec.begin(), vec.end(), 42);

	for (const auto &val : vec) {
		std::cout << val << " "; 
	}
	std::cout << std::endl;

    int m;
    std::cin >> m;

	std::vector<std::string> str_vec(m);
    for(int i = 0; i < m; i++)
        std::cin >> str_vec[i];
	matf::rasporedi_opseg(str_vec.begin(), str_vec.end(), std::string("Hello"));

	for (const auto &str : str_vec) {
		std::cout << str << " "; 
	}
	std::cout << std::endl;

	int k;
	std::cin >> k;

	std::vector<double> dvec(k);
	for(int i = 0; i < k; i++)
		std::cin >> dvec[i];
	matf::rasporedi_opseg(dvec.begin(), dvec.end(), 3.14);

	for (const auto &d : dvec) {
		std::cout << d << " "; 
	}
	std::cout << std::endl;

	return 0;
}

Primer

Ulaz

8
10 42 22 32 42 42 65 42
5
Hello Hi Good Morning Hello
7
3.14 2.71 1.41 3.14 0.577 3.14 1.73

Izlaz

42 42 42 42 10 22 32 65
Hello Hello Hi Good Morning
3.14 3.14 3.14 2.71 1.41 0.577 1.73

Šifrovanje

Neoznačeni broj se može šifrovati primenom ekskluzivne disjunkcije gde je drugi operand tajni ključ. Napisati funktor cypher koji čuva neoznačen broj koji predstavlja ključ za šifrovanje. Pozivom funktora cypher se šifruje prosleđeni neoznačen broj uz pomoć ključa.

Pored toga, napisati funktore count_ones i count_zeros koji za prosleđeni neoznačen broj vraćaju broj jedinica, odnosno nula, u binarnom zapisu.

Najzad, napisati funkciju:

template <typename Count>
void cypher_array(std::vector<unsigned>& vec, const cypher& cyph, Count cnt, unsigned n);

koja šifruje svaki od elemenata vektora vec za koji funktor cnt vrati kao rezultat broj veći ili jednak od n. Za šifrovanje se koristi prosleđeni funktor cyph.

Napomena: Sav studentski kod treba da se nađe u naznačenom delu rešenja.

Ulaz

Sa standardnog ulaza se učitava broj elemenata niza, a zatim i elementi niza (neoznačeni celi brojevi).

Izlaz

Na standardni izlaz ispisati niz nakon šifrovanja unetog niza ključem $42$, pri čemu se šifruju elementi sa barem $5$ jedinica u binarnom zapisu. Nakon toga rezultujući niz šifrovati sa ključem $123$, pri čemu se šifruju elementi sa barem $20$ nula u binarnom zapisu, pa novi rezultat ispisati na standardni izlaz.

Kod

#include <iostream>
#include <vector>

namespace matf {

    //Ovde ide vas kod

    template <typename Count>
    void cypher_array(std::vector<unsigned> &vec, cypher cyph, Count cnt, unsigned n)
    {
        //Ovde ide vas kod
    }

} // namespace matf

// -----------------------------------------------------

int main() 
{
    using namespace matf;

    unsigned m;
    std::cin >> m;

    std::vector<unsigned> a(m);
    for (unsigned i = 0; i < m; i++)
        std::cin >> a[i];

    cypher_array(a, cypher(42), count_ones(), 5);

    for (unsigned x : a) std::cout << x << " ";
    std::cout << "\n";

    cypher_array(a, cypher(123), count_zeros(), 20);

    for (unsigned x : a) std::cout << x << " ";
    std::cout << "\n";

    return 0;
}

Primer

Ulaz

5
1231 3212 2312 3221 2113

Izlaz

1253 3238 2312 3263 2113 
1182 3293 2419 3263 2106