eMatematikas Prisijunk Forumas Egzaminų užduotys ONLINE testai

Programavimo uždavinyje nerandu problemos


Sveiki, gal galit padėt surasti bėdą šiame uždavinyje? - https://imgur.com/CVsKQvv
Čia mano sprendimas :

Viskas lyg ir tvarkoj tik paskutinio grybautojo taškus apskaičiuoja irgi gerai ,tačiau skaičiaus gale prirašo vieną skaitmenį, gal numanot kokia galėtų būti problema ir kaip ją spręsti?

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

int main()
{  int n, m, a, b, c;
    int taskai1 = 0;
    int taskai2 = 0;
    int taskai3 = 0;
    int max = -1;
    ifstream in ("duom.txt");
    ofstream out ("rez.txt");
    in >> n >> m;
    for (int k = 0; k<n; k++)
    {
        for (int i = 0; i<=m; i++)
    {
        in >> a >> b >> c;
        a=a*3;
        b=b*2;
        c=c*1;
        taskai1 = a+b+c;
        taskai2 = a+b+c;
        taskai3 = a+b+c;
    }
    }
        if (taskai1>max) max = taskai1;
        if (taskai2>max) max = taskai2;
        if (taskai3>max) max = taskai3;
        out << "Laimejo 3-asis zmogus. Jis surinko "<< max << " taskus";
    in.close();
    out.close();
    return 0;
}

• Visų pirma - patarčiau tvarkingai formatuoti kodą;
• Antra - ostream/istream objektą abskelbk tik tada, kai ketini jį naudoti, o ne kodo pradžioje;
• Trečia - nebūtina priskirti naujos reikšmės a, b ar c kintamiesiems, kadangi šiuos veiksmus galima iškart atlikti ekspresijoje, kuri yra priskiriama galutiniam taškų kiekiui, tai:
a = a * 3;
b = b * 2;
c = c * 1;
taskai1 = a + b + c;
galima pakeisti į:
taskai1 = a * 3 + b * 2 + c;
• Ketvirta - kodėl tu vieno grybautojo taškus priskiri ir kitam? Pabandyk išvest į ekraną kiekvieno grybautojo taškus (taskai1, taskai2, taskai3) ir pamatysi, jog jų reikšmės yra identiškos. Šią problemą aš išspręsčiau arba su switch, arba su masyvais, arba su if'ais;
• Penkta - kaip tu gali naudoti max if'e, kai jo reikšmė yra konstanta ([tex]-1[/tex])? Tu privalai lyginti visų grybautojų taškus ir žiūrėti, kurio surinktų taškų kiekis didžiausias.

pakeista prieš 5 m

Oi, tik dabar pats pamačiau ką tu rašei ketvirtam punkte ,kad pas mane taip yra gal gali pamokyti kaip tai išspręsti be masyvų ,nes kol kas nesu susipažinęs su šia komanda (geriausia būtų su if ,nes tai aš suprantu ,tačiau būtų smagu išmokti ir switch sakinį).

#include <fstream>

int main() {
    unsigned n;
    unsigned m;

    std::ifstream input( "input.txt" );

    input >> n >> m;

    unsigned max    = 0;
    unsigned i      = 0; // Seka, kurio grybautojo eilė.

    // Kol nepraėjo visų grybautojų.
    // i++ yra lygu i += 1, bet jis veikia kitaip nei ++i:
    //    1. Išsaugo pradinę i reikšmę į laikiną;
    //    2. Padidina reikšmę, esančią i;
    //    3. Grąžina laikiną (originalią, dar nepakeistą i reikšmę).
    while ( ( i++ ) != n ) {
        unsigned temp = 0; // Laiko dabartinės iteracijos (dabartinio
                          // grybautojo (1-ojo, 2-ojo, n-ojo)) taškų kiekį.

        // b - baravykų skaičius;
        // r - raudonviršių skaičius;
        // v - voveraičių skaičius.
        for ( unsigned j = 0, b, r, v; j != m; ++j ) {
            input >> b >> r >> v;

            temp += b * 3 + r * 2 + v; // Suskaičiuojam, kiek
                                      // dabartinis grybautojas surinko taškų.
        }

        // Jeigu dabartinis grybautojas yra surinkęs daugiau negu
        // kolkas didžiausias kiekis.
        if ( temp > max ) {
            max = temp; // Vadinasi, dabartinio grybautojo taškų
                        // kiekis yra didžiausias.
        }
    }

    input.close();

    std::ofstream output( "output.txt" );

    // i - 1, kadangi po paskutinės iteracijos i reikšmė yra vienu
    // daugiau nei yra grybautojų dėl i++.
    output << "Laimejo " << i - 1
        << "-asis zmogus. Jis surinko " << max << " taska." << std::endl;

    output.close();

    return 0;
}

unsigned yra kitas pavadinimas unsigned int, o šis gali turėti tik neneigiamas ([tex]\geqslant 0[/tex]) reikšmes.

Pasirodo, jog nereikėjo nei if'ų, nei switch'ų, nei masyvų, bet jei vis tiek nori sužinoti kiek labiau apie switch'us - mielai paaiškinsiu.

P.S. Savo antrajame punkte (pirmajame savo komentare) turėjau omeny ifstream/ofstream objektus, o ne istream/ostream.

pakeista prieš 5 m

Ačiū TAU, malonei priimčiau tavo pamoką apie switch'us; Bet noriu paklausti tavo komandose kodėl negalima palikti tiesiog ifstream ,o reikia prirašyti std:: bei kodėl galutinio rezultato negalima išvesti į ekraną?

kodėl negalima palikti tiesiog ifstream ,o reikia prirašyti std::
Naudodamas
using namespace std;tu pasakai, jog norint naudoti vardus, kurie yra std (standard) namespace, neprivalu nurodyti namespace pavadinimo ir scope (::) operatoriaus. Dirbant ties didesniais projektais ši praktika yra laikoma bloga, kadangi kompiliatorius gali nežinoti iš kurio namespace tu kvieti vardą, jeigu jie yra identiškų pavadinimų, tad aš esu įpratęs šio dalyko nerašyt, nebent vardas, į kurį kreipiuosi, pasirodo daugiau nei du kartus mano programoje; tokiu atveju parašau:
using std::vardas;
kodėl galutinio rezultato negalima išvesti į ekraną?
Rezultato negalima išvesti, nes nesu nurodęs bibliotekos, kurioje yra apskelbtas cout (ostream) objektas. Jeigu norėčiau naudoti cout, įterpčiau biblioteką naudodamas #include direktyvą su bibliotekos pavadinimu (šiuo atveju, ta biblioteka - iostream):
#include <iostream>

malonei priimčiau tavo pamoką apie switch'us;
Tau apie juos paaiškinti čia ar nori eiti į pm?

Aišku, man nesvarbu aš turiu taikytis prie tavęs.

Duok dc, skype ar dar ką nors - parašysiu privačiai, kadangi tai jau kiek ne į temą.

dc : KSporty#9895

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