Pereiti prie turinio

Programavimo uždavinys


Rekomenduojami pranešimai

Tai va gavau toki uždavinį iš programavimo (c++) namų darbams ir niekaip nesumastau kaip daryt :D tai būtu labai cool jei kas padėtumet ir jei galima paprasčiau kaip nes 10kl dar daug nesam praeje

 

Uždavinys:

/**2010 metu spalio menuo buvo ypatingas - jis turejo 5 penkt, 5 sest, ir 5 sekm, taip atsitinka viena karta per 823 metus

parenkite programa, kuri nustatytu, kurie menesiai ir kuriais nurodyto intervalo metais, (pvz,[2005; 2012]) turi tokia savybe

Ivertinkite, kad keliamieji metai turi viena diena daugiau. Tai atsitinka tais metais, kuriu skaicius dalijasi is 4 be liekanos.

Taciau paskutiniai amziaus metai (dalijasi is 100 be liekanos) yra keliameiji tik tada, jei be liekanos dalijasi ir is 400. Jie nustatomi taip:

if (metai % 400 == 0 || (metai % 100 != 0 && metai % 4 == 0) )

keliamieji metai;

else

nekeliamieji metai;

Pasitikrinkite. 2010 metais tokius penkiu dienu rinkinius turejo sausis ir spalis, o 2011 metais - tik liepa.

Redagavo tautwelio
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveikas, šis uždavinys iš tiesų yra lengvas, jo sąlygoje trūktsta tik vieno svarbaus dalyko - atskaitos taško t.y kiekvienų metų sausio 1 savaitės dienos numerio. Sprendžiant uždavinius yra geriausiai susimažinti į mažesnes problemas, t.y pvz.: ne ieškoti metų intervale, o tik tuose pačiuose metuose.

 

bool isLeapYear(int n){ // Ar keliamieji metai
   return (n % 400 == 0) || (n % 100 != 0 && n % 4 == 0);
}

 

int months[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // Mėnesiai

void findIMonths(int year, int fday){ // Metai, tų metų sausio 1 dienos savaitės numeris
   int leapAddup = isLeapYear(year), fridays, sundays, saturdays, m, d;
   cout << year << ": ";
   for(m = 1; m <= 12; m++){ // per visus menesius
       fridays = 0, sundays = 0, saturdays = 0;
       for(d = 1; d <= (m == 2 ? months[m] + leapAddup : months[m]); d++){ // Einam per visas dienas
           if(fday == 5) fridays++;
           if(fday == 6) sundays++;
           if(fday == 7) saturdays++;
           fday = (fday % 7) + 1; // Pereinam prie kitos savaitės dienos
       }
       if(fridays == 5 && sundays == 5 && saturdays == 5)
           cout << m << " ";
   }
   cout << endl;
}

 

Ši funkcija suranda ir išspausdina kuriuose mėnesiuose įvyksta įdomūs mėnesiai.

- Funkcija "isLeapYear" gražina ar metai keliamieji ar ne, kadangi į tai reikia irgi atsižvelgti.

- Kintamasis leapAddup yra reikšmė kurią reikia pridėti vasario mėnesį jei metai yra keliamieji.

- "(m == 2 ? months[m] + leapAddup : months[m])" ši eilutė tikrina jei yra vasario mėnuo tai reikia pridėti kintamajį leapAddup, kuris gražina 0 arba 1.

 

Vienintelis klausimas lieka, kaip reikia surasti kiekvienų metų sausio 1 dienos numerį. Tam yra reikalingas kažkoks atskaitos taškas. Logiškiausia būtu pasiimti kažkokius metus kurių sausio 1 diena būtų pirmadienis. Tam galim pasinaudot kalendorių.

 

http://puu.sh/nntaX/6dc58a9f4f.png

 

Matom kad 1990 metų sausio 1 diena yra pirmadienis, tai mes galime panaudoti. Taigi dabar tereikia sukurti naują funkciją kuri apskaičiuotu įvedus metus didesnius 1989 kokia savaitės diena yra tų metų sausio 1 diena. Kadangi mes ėmėme 1990 metus kaip atskaitos tašką, ieškant mažesniuose metuose reikšmės gaunasi neigiamos tokiu atveju reikėtu papildomų sąlygų, bet į tai nesigilinsime.

 

int findFirstDay(int year){
   int y, m, d, resultDay = 1, leapAddup; // Reikšmės ir rezultatų diena
   for(y = 1990; y < year; y++){ // Per visus metus, nuo 1990 iki (neįskaitant) ieškomų
       leapAddup = isLeapYear(y);
       for(m = 1; m <= 12; m++){ // Per visus mėnesius
           for(d = 1; d <= (m == 2 ? months[m] + leapAddup : months[m]); d++){ // Per visas dienas nepamirštam keliamūju
               resultDay = (resultDay % 7) + 1; // Pereinam prie kitos savaitės dienos
           }
       }
   }
   return resultDay;
}

 

Štai ir pasirašėme funkciją kuri suranda kokia yra metų (didesnių nei 1989) sausio 1 savaitės diena. Kadangi išsprendėme visas problemas, bereikia nuskaityti duomenis, prasukti vieną ciklą per visus norimus metus ir uždavinys išspręstas ;)

Redagavo minimukas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...