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

Pagalba su uždavyniais


Er1ka

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1824 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

Reikia pagalbos su uždaviniais:

 

Tema: Tiesinis ciklinis sąrašas

Užduotis: X vaikų sustoja ratu. Parenkamas bet koks sveikas skaičius ir vaikas, nuo kurio pradedama skaičiuoti. Tada laikrodžio judėjimo kryptimi suskaičiuojamas vaikas, kuris palieka ratą. Skaičiuotė tęsiama tol, kol lieka vienas vaikas. Parašykite programą, kurioje būtų įvedamas vaikų skaičius ir vaikų vardai. Iš įvestų vardų sudaromas ciklinis vienkryptis sąrašas. Įvedamas skaičiuotės skaičius ir vaiko, nuo kurio pradedama skaičiuoti vardas. Programa turi išvesti į ekraną vardą to vaiko, kuris lieka paskutinis stovėti rate. Rašant programą turi būti numatyti visi galimi įvedimo atvejai (vaikų skaičius turi būti ne mažiau kaip 2, turi būti tikrinama ar įvestas egzistuojantis vaiko, nuo kurio pradedama skaičiuoti, vardas ir pan.) .

Redaguota , nario Er1ka
Nuoroda į komentarą
Dalintis per kitą puslapį

Dabar neišeis daug padėt, tik nurodyt kelią, nes ne prie PC sėdžiu. Anyway, įsivaizduoju, kad kalba eina apie std::forward_list. Tai pradėk nuo nuskaitymo ir sąrašo apgyvendinimo su std::forward_list::push_front. Paskui naudok std::forward_list::before_begin (aišku, pradinę reikšmę talpink kintamajame) ištrynimui ir std::forward_list::begin (taip pat talpink kintamajame) tikrinimui. Naudok whilefor ciklą su sąlyga, kol tame sąraše yra daugiau nei vienas vaikas. Jeigu prieini sąrašo galą ir dar nesibaigia ciklas, grąžink kintamuosius į pradines reikšmes (std::forward_list::before_begin ir std::forward_list::begin, atitinkamai). Kai norėsi ištrint (ką daryti reiktų su std::forward_list::erase_after), turi tai padaryti tvarkingai, kad iteratoriai netaptų nebenaudojami (invalidated).

P. S. Iš tikro tai būtų galima apsieiti be trynimų, bet tokiu variantu pasidalinsiu tik rytoj (t. y. šiandien, you get the drift) nebent.

 

Edit: teko kiek pamąstyt, bet ir tai nežinau, ar teisingai išsprendžia užduotį, nes man galva maišosi su tais skaičiavimais: nuo kurio nario pradėt n-ąjį skaičiavimą, ties kuriuo užbaigt, etc. Jeigu pateiktum pavyzdinius duomenis ir rezultatus, galėčiau kiek pakoreguoti programą, kad funkcionuotų tinkamai. Beje, be trynimo kolkas neišmąstau kaip reiktų padaryt, bet turbūt ir nepradėsiu.

#include <iostream>
#include <forward_list>
#include <string>
#include <iterator>

const unsigned get_valid_num( const std::string& msg, const unsigned min, const unsigned max ) {
    unsigned num = 0;
    std::string num_str;

    do {
        std::cout << msg << ": " << std::flush;
        std::getline( std::cin, num_str );

        if ( num_str.find_first_not_of( "0123456789" ) == std::string::npos ) {
            num = std::stoi( num_str );
        } else {
            std::cout << "Error: invalid entry. Retry." << std::endl;
        }
    } while ( num < min || num > max );

    return num;
}

const std::string get_valid_name() {
    std::string name;

    while ( true ) {
        std::cout << "Input a name of a child: " << std::flush;
        std::getline( std::cin, name );

        if ( name.find_first_not_of( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ) !=
             std::string::npos || !name.size() ) {
            std::cout << "Error: invalid entry. Retry." << std::endl;
        } else {
            break;
        }
    }

    return name;
}

int main() {
    std::forward_list<std::string> children;
    unsigned children_count = get_valid_num( "Input the amount of children", 2, children.max_size() );

    for ( unsigned i = 0; children_count != i; ++i ) {
        children.push_front( get_valid_name() );
    }

    children.reverse();

    const unsigned start_pos = get_valid_num( "Input the starting position", 0, children_count - 1 );

    auto prev = children.cbefore_begin();
    auto curr = children.cbegin();

    std::advance( prev, start_pos );
    std::advance( curr, start_pos );

    const unsigned incr_amt = get_valid_num( "Input the count amount", 1, -1 );

    for ( unsigned i = 0; children_count > 1; ++i ) {
        if ( i == incr_amt ) {
            curr = children.erase_after( prev );

            --children_count;
            i = 0;
        } else {
            prev = curr;

            if ( curr == children.cend() || ++curr == children.cend() ) {
                prev = children.cbefore_begin();
                curr = children.cbegin();
            }
        }
    }

    std::cout << children.front() << std::endl;

    return 0;
}

 

Redaguota , nario [m]
Nuoroda į komentarą
Dalintis per kitą puslapį

2019-05-01 23:42, Er1ka parašė:

Reikia pagalbos su uždaviniais:

 

Tema: Tiesinis ciklinis sąrašas

Užduotis: X vaikų sustoja ratu. Parenkamas bet koks sveikas skaičius ir vaikas, nuo kurio pradedama skaičiuoti. Tada laikrodžio judėjimo kryptimi suskaičiuojamas vaikas, kuris palieka ratą. Skaičiuotė tęsiama tol, kol lieka vienas vaikas. Parašykite programą, kurioje būtų įvedamas vaikų skaičius ir vaikų vardai. Iš įvestų vardų sudaromas ciklinis vienkryptis sąrašas. Įvedamas skaičiuotės skaičius ir vaiko, nuo kurio pradedama skaičiuoti vardas. Programa turi išvesti į ekraną vardą to vaiko, kuris lieka paskutinis stovėti rate. Rašant programą turi būti numatyti visi galimi įvedimo atvejai (vaikų skaičius turi būti ne mažiau kaip 2, turi būti tikrinama ar įvestas egzistuojantis vaiko, nuo kurio pradedama skaičiuoti, vardas ir pan.) .

Pateik uždavinio testavimui sąlygą. Nes parašyti kodą, be testinių duomenų, truputį sunku.

Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1824 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ą...