Feladatok tömbökkel (3. rész)

Adott tulajdonság ellenőrzése

1. (létezik kvantorral)

Adott egy tömb, mondjuk meg, hogy van-e benne 5-tel osztható elem! (A válasz “igen” vagy “nem”.)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int t[100];

    for (int i = 0; i < n; i++)
        cin >> t[i];

    bool talalt = false;

    for (int i = 0; i < n; i++)
        if (t[i] % 5 == 0)
            talalt = true;

    if (talalt)
        cout << "igen" << endl;
    else
        cout << "nem" << endl;

    return 0;
}

2. (bármely kvantorral)

Adott egy tömb, mondjuk meg, hogy igaz-e rá, hogy minden eleme osztható 5-tel! (A válasz “igen” vagy “nem”.)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int t[100];

    for (int i = 0; i < n; i++)
        cin >> t[i];

    bool talalt_rossz = false;

    for (int i = 0; i < n; i++)
        if (t[i] % 5 != 0)
            talalt_rossz = true;

    if (talalt_rossz)
        cout << "nem" << endl;
    else
        cout << "igen" << endl;

    return 0;
}

Megjegyzés: tulajdonképpen azt néztük meg, hogy létezik-e olyan elem, ami nem jó.

Hol a hiba a következőben?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int t[100];

    for (int i = 0; i < n; i++)
        cin >> t[i];

    bool jo = true;

    for (int i = 0; i < n; i++)
        if (t[i] % 5 == 0)          // így nem jó!
            jo = true;
        else
            jo = false;

    if (jo)
        cout << "igen" << endl;
    else
        cout << "nem" << endl;

    return 0;
}

Nem állíthatjuk át a helyességet jelző változó értékét minden körben, mert akkor tulajdonképpen csak az utolsó elemtől függne a végeredmény (és nem ezt akartuk)!

3.

https://www.pbinfo.ro/probleme/501/verifegale
Ellenőrizni kell, hogy a tömb minden eleme azonos-e.

Pl.
   5
   6 6 4 6 6  -> NU

   5
   6 6 6 6 6  -> DA

Ötlet: minden elemre megnézzük, hogy egyenlő-e az elsővel.

HF.

4.

https://www.pbinfo.ro/probleme/502/verifdiferite
Ellenőrizni kell, hogy a tömb bármely két eleme különböző-e.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;

int main()
{
    int n, t[500];
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> t[i];

    bool jo = true;

    for (int i = 0; i < n; i++)
        for (int j = i+1; j < n; j++)
            if (t[i] == t[j])
                jo = false;

    if (jo)
        cout << "DA" << endl;
    else
        cout << "NU" << endl;

    return 0;
}

5.

https://www.pbinfo.ro/probleme/500/verificareordonat
Ellenőrizni kell, hogy a tömb elemei növekvő sorrendben vannak-e.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;


int main()
{
    int n;
    cin >> n;

    int t[500];

    for (int i = 0; i < n; i++)
        cin >> t[i];

    bool jo = true;

    for (int i = 0; i <= n-2; i++) {
        if (t[i] > t[i+1])
            jo = false;
    }

    if (jo)
        cout << "DA" << endl;
    else
        cout << "NU" << endl;
    return 0;
}

Vagy (tömb nélkül):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;


int main()
{
    int n;
    cin >> n;

    bool jo = true;

    int elozo = -1;

    for (int i = 0; i < n; i++) {
        int szam;
        cin >> szam;

        if (szam < elozo)
            jo = false;

        elozo = szam;
    }


    if (jo)
        cout << "DA" << endl;
    else
        cout << "NU" << endl;

    return 0;
}

6.

https://www.pbinfo.ro/probleme/290/pareordonate
Ellenőrizni kell, hogy a tömb páros elemei növekvő sorrendben vannak-e.

Ötlet (szétválogatás): a párosakat egy másik tömbbe kigyűjtjük, majd azon az előző feladatnak megfelelően ellenőrizzük, hogy növekvő sorrendben vannak-e az elemei.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <climits>
using namespace std;

int main()
{
    int n;
    cin >> n;

    int t[100];
    int index = 0;

    for (int i = 0; i < n; i++) {
        int szam;
        cin >> szam;

        if (szam % 2 == 0) {
            t[index] = szam;
            index++;
        }
    }

    bool jo = true;

    for (int i = 0; i <= index-2; i++) {
        if (t[i] > t[i+1]) {
            jo = false;
        }
    }

    if (jo)
        cout << "DA" << endl;
    else
        cout << "NU" << endl;

    return 0;
}

Más ötlet: minden párosra ellenőrizzük, hogy nem-e kisebb, mint az előző páros (egy változóban tárolva, hogy ki az előző páros).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <climits>
using namespace std;

int main()
{
    int n;
    cin >> n;

    bool jo = true;

    int elozo = INT_MIN;

    for (int i = 0; i < n; i++) {
        int szam;
        cin >> szam;

        if (szam % 2 == 0) {
            if (szam < elozo)
                jo = false;

            elozo = szam;
        }
    }

    if (jo)
        cout << "DA" << endl;
    else
        cout << "NU" << endl;

    return 0;
}

6.b. Szétválogatás általában

Beolvasunk egy n elemű tömböt. Válogassuk szét két másik tömbbe a páros és páratlan elemeket.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;

    int t[100];
    for (int i = 0; i < n; i++)
        cin >> t[i];

    int tparos[100];
    int nparos = 0;

    int tparatlan[100];
    int nparatlan = 0;

    for (int i = 0; i < n; i++)
        if (t[i] % 2 == 0) {
            tparos[nparos] = t[i];
            nparos++;
        }
        else {
            tparatlan[nparatlan] = t[i];
            nparatlan++;
        }

    cout << "parosak: ";
    for (int i = 0; i < nparos; i++)
        cout << tparos[i] << " ";
    cout << endl;

    cout << "paratlan: ";
    for (int i = 0; i < nparatlan; i++)
        cout << tparatlan[i] << " ";
    cout << endl;

    return 0;
}

6.c. Szétválogatás HF

Beolvasunk egy n elemű tömböt. Válogassuk szét két másik tömbbe a prím és nemprím elemeket!

7.

https://www.pbinfo.ro/probleme/162/permcirc

HF (opcionális)

8.

https://www.pbinfo.ro/probleme/2996/paritar

HF (opcionális)