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.

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