Matura 2014 – Ciekawe napisy

TREŚĆ ZADANIA


ROZWIĄZANIE

[sociallocker id=”128″]

#include <iostream>
#include <fstream>
#include <map>
using namespace std;

//podpunkt A
bool napis_pierwszy(string s)
{
    int suma=0;
    for (int i=0; i<s.size(); i++)
        suma+=s[i];

    for (int i=2; i<=suma/2; i++)
        if (suma%i==0)
            return false;

    return true;
}

//podpunkt B
bool napis_rosnacy(string s)
{
    for (int i=0; i<s.size()-1; i++)
        if (s[i]>=s[i+1])
            return false;

    return true;
}

int main() {

    fstream in("plik.txt");
    string s;
    map <string,int> mapa;

    while(!in.eof())
    {
        in >> s;
        mapa[s]++;
    }

    //pktA
    int ile=0;
    for (auto i=mapa.begin(); i!=mapa.end(); i++)
    {
        if (napis_pierwszy(i->first))
            ile += i->second;
    }
    cout << ile << "\n\n";

    //pktB
    for (auto i=mapa.begin(); i!= mapa.end(); i++)
    {
        if (napis_rosnacy(i->first))
            for (int j=1; j<= i->second; j++)
                cout << i->first << endl;
    }

    //pktC
    cout << "\n";
    for (auto i=mapa.begin(); i!=mapa.end(); i++)
    {
        if (i->second > 1)
        cout << i->first << endl;
    }

    return 0;
}


ANALIZA ROZWIĄZANIA

Wczytuje wszystkie napisy z pliku txt do mapy i zlicza ile razy występował dany napis.

fstream in("plik.txt");
string s;
map <string,int> mapa;

while(!in.eof())
{
    in >> s;
    mapa[s]++;
}


Podpunkt A
W instrukcji warunkowej następuje zliczanie napisów pierwszych.

int ile=0;
for (auto i=mapa.begin(); i!=mapa.end(); i++)
{
    if (napis_pierwszy(i->first))
        ile += i->second;
}
cout << ile;

Funkcja sprawdza czy napis jest napisałem pierwszym. Zwraca true lub false.

bool napis_pierwszy(string s)
{
    int suma=0;
    for (int i=0; i<s.size(); i++)
        suma+=s[i];

    for (int i=2; i<=suma/2; i++)
        if (suma%i==0)
            return false;

    return true;
}


Podpunkt B
Pętla for wyświetla wszystkie napisy rosnące wraz z powtórzeniami.

 for (auto i=mapa.begin(); i!= mapa.end(); i++)
 {
    if (napis_rosnacy(i->first))
       for (int j=1; j<= i->second; j++)
          cout << i->first << endl;
 }

Funkcja sprawdza czy napis jest rosnący. Zwraca true lub false.

bool napis_rosnacy(string s)
{
    for (int i=0; i<s.size()-1; i++)
        if (s[i]>=s[i+1])
            return false;

    return true;
}


Podpunkt C
Pętla for wyświetla wszystkie napisy, które występują w mapie więcej niż jeden raz.

for (auto i=mapa.begin(); i!=mapa.end(); i++)
    {
        if (i->second > 1)
        cout << i->first << endl;
    }

KLUCZ ODPOWIEDZI


Arkusz, klucz odpowiedzi, plik z danymi znajdziesz na naszej grupie.

Zauważyłeś błąd na stronie?

[/sociallocker]

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.