eMatematikas Prisijunk Forumas Egzaminų užduotys ONLINE testai

Uždavinys su laimingu autobuso bilieto numeriu C++


Autobusų parko administracija nusprendė keleiviams, kurių bilietų numeriai laimingi, dovanoti kelionę už pusę kainos. Autobuso bilietas laikomas laimingu, jei jo pirmųjų trijų skaitmenų trejetas sutampa su paskutinių trijų skaitmenų trejetu (pvz., laimingas bilietas, kurio numeris yra 234234). Autobusų parko administracija nutarė bilietus sunumeruoti nuo m­ojo iki n­ojo šešiaženklio skaičiaus. Parašykite programą, kuri apskaičiuotų, kiek keleivių k įsigis laimingus bilietus. Pasitikrinkite. Kai m = 170849, o n = 189965, turi būti spausdinama: Laimingus bilietus įsigijo k=19 keleivių.

Aš žinau, kad pagrindinė šio uždavinio idėja yra naudoti ciklą ir sąlygos sakinį IF (kol kas aš tik juos moku), tačiau man niekaip nepavyksta išspręsti šios užduoties nors tu ką :(
Taigi, gal kas nors galėtų man pagelbėti?

#include <iostream>

using namespace std;

int main()
{
    int m, n, k, i, a, b;

    cout << "m = "; cin >> m;
    cout << "n = "; cin >> n;

    for ( i=m; i<=n; i++ ) {
       
        a = i/1000;
        b = (i%1000)*100;
       
    }
    if ( a==b )
       

    return 0;
}


Spėju, kad daugmaž taip turėtų viskas atrodyti, bet man niekaip nesigauna ta dalis po if.

pakeista prieš 6 m

O kodėl if sąlyga už ciklo ribų? Juk vykdant ciklą ir tikriname, kurie bilietų numeriai tenkina sąlygą. O sąlygos pas tave teisingos nematau. Kas tie a ir b? Tau cikle reiktų parašyti tokią sąlygą:
Jei (pirmas=ketvirtas) ir (antras=penktas) ir (trečias=šeštas), tada kintamasis k, kuriam pirminė reikšmė turėtų būti prisikiriama 0, padidinama vienetu.

Mano nupasakotą situaciją užrašyk kodu, o tie skaičiai užrašyti žodžiais reiškia i-tojo skaičiaus skaitmenų pozicijas, kuriose yra mums reikalingi skaitmenys.

O kodėl if sąlyga už ciklo ribų? Juk vykdant ciklą ir tikriname, kurie bilietų numeriai tenkina sąlygą. O sąlygos pas tave teisingos nematau. Kas tie a ir b? Tau cikle reiktų parašyti tokią sąlygą:
Jei (pirmas=ketvirtas) ir (antras=penktas) ir (trečias=šeštas), tada kintamasis k, kuriam pirminė reikšmė turėtų būti prisikiriama 0, padidinama vienetu.

Mano nupasakotą situaciją užrašyk kodu, o tie skaičiai užrašyti žodžiais reiškia i-tojo skaičiaus skaitmenų pozicijas, kuriose yra mums reikalingi skaitmenys.



#include <iostream>

using namespace std;

int main()
{
    int m, n, k, i;

    cout << "m = "; cin >> m;
    cout << "n = "; cin >> n;

    for ( i=m; i<=n; i++ ) {
    if ( i/100000==i%1000*10 && i%100000*10==i%100*10 && i%10000*10==i%10*10  )
        k = 0;
        k = k + 1;
        cout << "Laimingus bilietus isigijo " << k << " keleiviu." << endl;
    } 
   
    return 0;
}

Tikriausiai ne pilnai supratau tavo mintį, nes man vis nesigauna :(

Man būtų įdomu, jei paaiškintum, ką gauname atlikę veiksmus:
i%1000*10, i%100000*10, i%100*10, i%10000*10, i%10*10?
Norint gauti norimą skaitmenį reikia naudoti % ir / dalybos veiksmus, daugyba čia visiškai nereikalinga.
Ir dar ar supranti, jog dabar kiekvienąkart vykdant ciklą tu vis priskiri k reikšmei iš naujo 0, tai kaip ji gali kaupti kažkokią reikšmę? Tai tą priskyrimą k=0 reiktų atlikti prieš ciklą (t.y. galima tai padaryti tiesiog sukuriant kintamąjį) Šiaip tas priskirimas reikalingas tam, jog kartais pati programa nebūtų iš anksto nustačius kitos pirminės reikšmės, nes jei tarkime jis bus lygi 1, tai rezultate gausime vienetu didesnę reikšmę nei reikalinga. Ir išvedimą reikia daryti pasibaigus ciklui, o ne jo vykdymo ribose. Man atrodo tu nevisai supranti, kaip kodas veikia, todėl tau ir yra sunkumų rašant kodą.

pakeista prieš 6 m

Prašom, nagrinėkis ir jei dar kyla klausimų, rašyk:
#include <iostream>

using namespace std;

int main()
{
    int m, n, k=0, i;

    cout << "m = "; cin >> m;
    cout << "n = "; cin >> n;
   
    for ( i=m; i<=n; i++ )
    {
      if ( i/100000==i%1000/100 && i/10000%10==i%100/10 && i/1000%10==i%10  ) k = k+ 1;
    }

    cout << "Laimingus bilietus isigijo " << k << " keleiviu." << endl;
    return 0;
}

Vietoje k=k+1  galime naudoti ir trumpesnį užrašą: k+=1, aplamai:
k=k+n (k - kintamasis, n bet koks skaičius) tas pats kas k+=n
k=k-n (k - kintamasis, n bet koks skaičius) tas pats kas k-=n
k=k*n (k - kintamasis, n bet koks skaičius) tas pats kas k*=n
k=k/n (k - kintamasis, n bet koks skaičius) tas pats kas k/=n

pakeista prieš 6 m

Prašom, nagrinėkis ir jei dar kyla klausimų, rašyk:
#include <iostream>

using namespace std;

int main()
{
    int m, n, k=0, i;

    cout << "m = "; cin >> m;
    cout << "n = "; cin >> n;
   
    for ( i=m; i<=n; i++ )
    {
      if ( i/100000==i%1000/100 && i/10000%10==i%100/10 && i/1000%10==i%10  ) k = k+ 1;
    }

    cout << "Laimingus bilietus isigijo " << k << " keleiviu." << endl;
    return 0;
}

Vietoje k=k+1  galime naudoti ir trumpesnį užrašą: k+=1, aplamai:
k=k+n (k - kintamasis, n bet koks skaičius) tas pats kas k+=n
k=k-n (k - kintamasis, n bet koks skaičius) tas pats kas k-=n
k=k*n (k - kintamasis, n bet koks skaičius) tas pats kas k*=n
k=k/n (k - kintamasis, n bet koks skaičius) tas pats kas k/=n


Dėkui už pagalbą. Gal galėtum parekomenduoti kokių gerų knygų apie c++ pradedantiesiems ir pažengusiems (kur būtų teorija+uždaviniai)?

Na čia ką pats turiu: https://drive.google.com/drive/folders/1CM-pO9wgIBCZlxHt9eJiBqVGdWgEmKOF?usp=sharing
Atsisiųk į savo kompiuterį, paskui nuorodą uždarysiu.

Na čia ką pats turiu: https://drive.google.com/drive/folders/1CM-pO9wgIBCZlxHt9eJiBqVGdWgEmKOF?usp=sharing
Atsisiųk į savo kompiuterį, paskui nuorodą uždarysiu.


Atsisiunčiau, dėkui.

Nori sudalyvauti šioje temoje ir parašyti savo pranešimą? Prisijungti »