Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

Pasikartojančių simbolių skaičiavimas


darrel.

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 677 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Užduotis atrodytų paprasta - suskaičiuoti kiek balsių žodyje pasikartoja. Tačiau susiduriu su keista problema.
 

Paimkime žodį namas. Programa suskaičiuoja, kad balsė a, kartojasi vieną kartą, o žodyje bananas, trys. 

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string zodis;

    cout << "Įrašykite žodį: ";
    cin >> zodis;

    char balses[] = { 'a', 'e', 'i', 'o', 'u' };
    int balsiu_kiekis = 5;
    char balses_zodyje[100];
    int balses_zodyje_kiekis = 0;

    for (int j = 0; j < zodis.length(); j++)
    {
       for (int i = 0; i < count; i++)
       {
           if (zodis.at(j) == balses[i])
           {
               balses_zodyje[balses_zodyje_kiekis] = zodis.at(j);
               balses_zodyje_kiekis++;
           }
       }
    }

    char pasikartojancios_balses[100];
    int pasikartojancios_balses_kiekis = 0;

    for (int i = 0; i < balses_zodyje_kiekis; i++)
    {
        for (int j = i + 1; j <= balses_zodyje_kiekis; j++)
        {
            if (balses_zodyje[i] == balses_zodyje[j])
            {
                pasikartojancios_balses[pasikartojancios_balses_kiekis] = balses_zodyje[i];
                pasikartojancios_balses_kiekis++;
            }
        }
    }

    cout << "\nŽodyje " << zodis << " iš viso yra " << balses_zodyje_kiekis << " balsių";
    cout << "\nPasikartojančių balsių yra: " << pasikartojancios_balses_kiekis;
    return 0;
}

Iš esmės, kaip ir atrodytų turėtų sakyti, kad balsė a žodyje namas, pasikartoja du kartus, tačiau taip nėra. Kaip šitą nesąmoningą kodą pertvarkyti? Ačiū iš anksto.

Redaguota , nario darrel.
Nuoroda į komentarą
Dalintis per kitą puslapį

Labai komplikuotai sprendi, kad net as sugebejau pasimest kas cia vyksta. Siulyciau geriau pasiziureti sita pavyzdi ir pasianalizuoti, nes cia vienas is geresniu sprendimu sitam uzdaviniui

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string zodis;

    cout << "Irasykite zodi: ";
    cin >> zodis;

    int balsiu_kiekis = 5;
    char balses[balsiu_kiekis] = { 'a', 'e', 'i', 'o', 'u' };
    int raides_kiekis_zodyje[128] = {0};

    for (int i = 0; i < zodis.length(); ++i)
    {
       ++raides_kiekis_zodyje[ (int) zodis[i] ];
    }
    int balsiu_kiekis_zodyje = 0;
    int pasikartojanciu_balsiu_kiekis = 0;
    for(int i = 0; i < balsiu_kiekis; ++i){
        balsiu_kiekis_zodyje += raides_kiekis_zodyje[ (int) balses[i] ];
        if(raides_kiekis_zodyje[(int) balses[i]] >= 2){
            ++pasikartojanciu_balsiu_kiekis;
        }
    }

    cout << "\nZodyje " << zodis << " is viso yra " << balsiu_kiekis_zodyje << " balsiu";
    cout << "\nPasikartojanciu balsiu yra: " << pasikartojanciu_balsiu_kiekis;
    return 0;
}

 

 

Redaguota , nario Zero Two
Nuoroda į komentarą
Dalintis per kitą puslapį

(redaguota)

 

26 minutes prieš, Zero Two parašė:

Labai komplikuotai sprendi, kad net as sugebejau pasimest kas cia vyksta. Siulyciau geriau pasiziureti sita pavyzdi ir pasianalizuoti, nes cia vienas is geresniu sprendimu sitam uzdaviniui

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string zodis;

    cout << "Irasykite zodi: ";
    cin >> zodis;

    int balsiu_kiekis = 5;
    char balses[balsiu_kiekis] = { 'a', 'e', 'i', 'o', 'u' };
    int raides_kiekis_zodyje[128] = {0};

    for (int i = 0; i < zodis.length(); ++i)
    {
       ++raides_kiekis_zodyje[ (int) zodis[i] ];
    }
    int balsiu_kiekis_zodyje = 0;
    int pasikartojanciu_balsiu_kiekis = 0;
    for(int i = 0; i < balsiu_kiekis; ++i){
        balsiu_kiekis_zodyje += raides_kiekis_zodyje[ (int) balses[i] ];
        if(raides_kiekis_zodyje[(int) balses[i]] >= 2){
            ++pasikartojanciu_balsiu_kiekis;
        }
    }

    cout << "\nZodyje " << zodis << " is viso yra " << balsiu_kiekis_zodyje << " balsiu";
    cout << "\nPasikartojanciu balsiu yra: " << pasikartojanciu_balsiu_kiekis;
    return 0;
}

 

 

++raides_kiekis_zodyje[ (int) zodis[i] ]

O kaip čia toks dalykas veikia? Kažkaip neteko susidurti ar kažkur skaityti apie tokį masyvo panaudojimo būdą. Gal kokia pamoką ar kažką turi, kur galėčiau daugiau pasiskaityti? Šiaip, ačiū labai.

Redaguota , nario darrel.
Nuoroda į komentarą
Dalintis per kitą puslapį

19 minutes prieš, darrel. parašė:

 

++raides_kiekis_zodyje[ (int) zodis[i] ]

O kaip čia toks dalykas veikia? Kažkaip neteko susidurti ar kažkur skaityti apie tokį masyvo panaudojimo būdą. Gal kokia pamoką ar kažką turi, kur galėčiau daugiau pasiskaityti? Šiaip, ačiū labai.

cia nera labai nieko sunkaus, jei minimaliai ismanai kaip raides ir atmintis veikia. ASCII simboliai yra 1 baito dydzio, reiskias jie bus iki 255. Bet kad nekvarsint galvos, lengviau galima pasiziuret sita lentele (ASCII table):

ascii-table-alpharithms-scaled.jpg

tai jei pasiziuresi dec dali, visi simboliai kuriuos matai bus iki 127, o C kalba leidzia char paversti i int, int'a paverciant atitinkama dec reiksme. Tai pvz (int) 'Q' bus lygu 81, (int) 'z' bus lygu 122.

Tai mintis sio sprendimo yra, kad turi masyva 128 dydzio, kuriame saugosi kiek turi kiekvieno simbolio. Indeksas bus raides numeris, o reiksme bus kiek kartu radai ta raide. Tokiu principu pasiemi kiekviena zodzio raide, ir pridedi 1 tam indeksui

raides_kiekis_zodyje['n']++;
raides_kiekis_zodyje['a']++;
raides_kiekis_zodyje['m']++;
raides_kiekis_zodyje['a']++;
raides_kiekis_zodyje['s']++;

cout << raides_kiekis_zodyje['n']; //1
cout << raides_kiekis_zodyje['a']; //2
cout << raides_kiekis_zodyje['m']; //1
cout << raides_kiekis_zodyje['s']; //1

net nebutina deti (int) 'a', nes kompiliatorius pats supranta kaip interpretuoti 

 

prie to paties: gali daryti vice versa, raidei priskirti skaiciu, pvz char raide = 104; raide bus 'h'

Redaguota , nario Zero Two
Nuoroda į komentarą
Dalintis per kitą puslapį

(redaguota)
prieš 2 valandas(-ų), Zero Two parašė:

cia nera labai nieko sunkaus, jei minimaliai ismanai kaip raides ir atmintis veikia. ASCII simboliai yra 1 baito dydzio, reiskias jie bus iki 255. Bet kad nekvarsint galvos, lengviau galima pasiziuret sita lentele (ASCII table):

ascii-table-alpharithms-scaled.jpg

tai jei pasiziuresi dec dali, visi simboliai kuriuos matai bus iki 127, o C kalba leidzia char paversti i int, int'a paverciant atitinkama dec reiksme. Tai pvz (int) 'Q' bus lygu 81, (int) 'z' bus lygu 122.

Tai mintis sio sprendimo yra, kad turi masyva 128 dydzio, kuriame saugosi kiek turi kiekvieno simbolio. Indeksas bus raides numeris, o reiksme bus kiek kartu radai ta raide. Tokiu principu pasiemi kiekviena zodzio raide, ir pridedi 1 tam indeksui

raides_kiekis_zodyje['n']++;
raides_kiekis_zodyje['a']++;
raides_kiekis_zodyje['m']++;
raides_kiekis_zodyje['a']++;
raides_kiekis_zodyje['s']++;

cout << raides_kiekis_zodyje['n']; //1
cout << raides_kiekis_zodyje['a']; //2
cout << raides_kiekis_zodyje['m']; //1
cout << raides_kiekis_zodyje['s']; //1

net nebutina deti (int) 'a', nes kompiliatorius pats supranta kaip interpretuoti 

 

prie to paties: gali daryti vice versa, raidei priskirti skaiciu, pvz char raide = 104; raide bus 'h'

Ačiū už tokį paaiškinimą. Labiausiai, kas nustebino, tai kiek kitoks lygybės būdas. Visada galvojau, kad tiesiog turi rašyti masyvas = kitam masyvui, o čia pasirodo, gali dar ir taip :D

Redaguota , nario darrel.
Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 677 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...