program konsolowy do sprawdzenia ile miesiąc ma dni - nie działa prawidłowo

0

Witam w moim programie chciałbym, żeby poprawnie się wyświetlało ile dany miesiąc ma dni ale mam problem a mianowicie np przy roku przystępnym (2000 rok) w 2 miesiącu pojawia mi się, że ma dni 29. Jak mam to poprawić, żeby mi się wyświetlało, że w roku przystępnym w 2 miesiącu jest 28 dni? Już nie mam pomysłu na to i dlatego proszę o wsparcie.
Jest ktoś w stanie mi pomóc i uzupełnić kod o tą małą kwestię?
Z góry dziękuję
To mój kod:

 
double rokPrzystepny;
                int miesiac;
            Console.WriteLine("Podaj rok");
            rokPrzystepny = double.Parse(Console.ReadLine());
            if ((rokPrzystepny % 4 ==0) && (rokPrzystepny % 100 == 1) || (rokPrzystepny % 400 ==0)) 
                 Console.WriteLine("To rok przystepny");
            else Console.WriteLine("To rok nieprzystepny");

           Console.WriteLine("Podaj numer miesiąca");
           miesiac = int.Parse(Console.ReadLine());

            
           if ((miesiac == 1) || (miesiac == 3) || (miesiac == 5) || (miesiac == 7) ||
               (miesiac == 8) || (miesiac == 10) || (miesiac == 12)) Console.WriteLine("Podany miesiąc ma 31 dni");
           if ((miesiac == 4) || (miesiac == 6) || (miesiac == 9) || (miesiac == 11))
               Console.WriteLine("Podany miesiąc ma 30");
            Console.WriteLine("Podany miesiac ma 29dni");
           
           
           Console.ReadKey();





0

Pierwsza sprawa to to, ze rok przestepny jest co cztery lata, wiec wystarczy sprwadzic podzielnosc przez 4;)

Po drugie, jak masz te dwa ify, w zadnym z nich nie masz miesiaca o numerze 2, wiec taki miesiac nie zalapie sie na zadnego ifa, tylko po prostu wypiszesz dla niego "29dni". Pasowaloby w tym miejscu uzaleznic to od tego, czy rok przestepny, no nie?:)

I jeszcze taka mala dygresja, lepiej ten rok trzymac w zmiennej o nazwie po prostu "rok", o typie calkowitym (rok nie jest raczej zmiennoprzecinkowy), dodatkowo mozesz zadeklarowac zmienna rokPrzestepny jako bool i po wczytaniu od uzytkownika danych, przypisujesz do rokPrzestepny:

bool rokPrzestepny = rok % 4;
0

Sprawdzasz na początku czy rok jest przestępny, tak? To zapisz sobie wynik tego porównania do jakiegoś bool. Potem po obu ifach (30 i 31 dni) zrób ifa w którym uzależniasz czy 28 czy 29 od tego boola

0
FakeAccount napisał(a):

Pierwsza sprawa to to, ze rok przestepny jest co cztery lata, wiec wystarczy sprwadzic podzielnosc przez 4;)

Niestety tak nie jest sprawdź http://www.kalendarzswiat.pl/rok_przestepny/ rok 1800 dzieli się przez 4 a nie jest przystępny ;)

Po drugie, jak masz te dwa ify, w zadnym z nich nie masz miesiaca o numerze 2, wiec taki miesiac nie zalapie sie na zadnego ifa, tylko po prostu wypiszesz dla niego "29dni". Pasowaloby w tym miejscu uzaleznic to od tego, czy rok przestepny, no nie?:)

I jeszcze taka mala dygresja, lepiej ten rok trzymac w zmiennej o nazwie po prostu "rok", o typie calkowitym (rok nie jest raczej zmiennoprzecinkowy), dodatkowo mozesz zadeklarowac zmienna rokPrzestepny jako bool i po wczytaniu od uzytkownika danych, przypisujesz do rokPrzestepny:

bool rokPrzestepny = rok % 4;

Czyli ktoś wie jak mi pomóc? I dopisać ten kod gdzie będzie prawidłowo działało?
Chodzi mi uzupełnienie w moim obecnym kodzie z całkowitą znajomością kiedy rok jest przystępny
Konkretnie chce odpowiedzi:)

0
if ((rokPrzystepny % 4 ==0) && (rokPrzystepny % 100 == 1) || (rokPrzystepny % 400 ==0)) 

Według tego warunku 2004 nie jest przestępny.
Lepiej rok zapisuj na int, dzielisz później porównujesz do zera nie zdziwię się jeśli gdzieś z dzielenia dostaniesz 0.000000012

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

Poprawione i na int też również.
Mógłbyś mi podać odpowiedź na moje pytanie ? ;)
Jest ktoś w stanie mi pomóc?
Czy jednak mam liczyć na siebie jak to w życiu zwykle jest.

1
 if ((miesiac == 4) || (miesiac == 6) || (miesiac == 9) || (miesiac == 11))
{
//30dni
}
else if(miesiac == 2)
{
  if(sprawdzasz czy rok jest przestępny)
   {//i wypisujesz co trzeba}
   
}
else 
{
//jeśli nie jest to miesiąc 2,4,6,9,11 to ma 31dni
}
0
dam1an napisał(a):
 if ((miesiac == 4) || (miesiac == 6) || (miesiac == 9) || (miesiac == 11))
{
//30dni
}
else if(miesiac == 2)
{
  if(sprawdzasz czy rok jest przestępny)
   {//i wypisujesz co trzeba}
   
}
<quote="1083183">else 
{
//jeśli nie jest to miesiąc 2,4,6,9,11 to ma 31dni
}

//jeśli nie jest to miesiąc 2,4,6,9,11 to ma 31dni w 2 miesiącu nie będzie miał 31 dni. W przystępnym 29 a w nieprzystępnym 28

0

No ale o co Ci chodzi?

if ((miesiac == 4) || (miesiac == 6) || (miesiac == 9) || (miesiac == 11))
{
//30dni
}
else if(miesiac == 2)
{
  if(sprawdzasz czy rok jest przestępny)
   { 
      //29dni
   }
   else
    {
       //28dni
    }
 
}
else 
{
//31dni
}
0

poprawiony kod

 double rokPrzystepny;
            
                int miesiac;
            Console.WriteLine("Podaj rok");
            rokPrzystepny = double.Parse(Console.ReadLine());
            if ((rokPrzystepny % 4 ==0) && (rokPrzystepny % 100 !=0) || (rokPrzystepny % 400 ==0)) 
                 Console.WriteLine("To rok przystepny");
            else Console.WriteLine("To rok nieprzystepny");

           Console.WriteLine("Podaj numer miesiąca");
           miesiac = int.Parse(Console.ReadLine());

            
           if ((miesiac == 1) || (miesiac == 3) || (miesiac == 5) || (miesiac == 7) ||
               (miesiac == 8) || (miesiac == 10) || (miesiac == 12)) Console.WriteLine("Podany miesiąc ma 31 dni");
           if ((miesiac == 4) || (miesiac == 6) || (miesiac == 9) || (miesiac == 11))
               Console.WriteLine("Podany miesiąc ma 30");
           else if (miesiac == 2)
           {
               if ((rokPrzystepny % 4 == 0) && (rokPrzystepny % 100 != 0) || (rokPrzystepny % 400 == 0))

                   Console.WriteLine("Podany miesiac ma 29dni");
               else Console.WriteLine("Podany miesiąc ma 28dni");
           }
           
           
           Console.ReadKey();   
      

Chodziło mi o to, że w tym co napisałeś:

 else 
{
//jeśli nie jest to miesiąc 2,4,6,9,11 to ma 31dni
}

Źle podałeś 2 miesiąc, on nigdy nie ma 31 dni. Ma 28 lub 29dni.

Dziękuje za nakierowanie mnie na rozwiązanie :)

0

Mógłbyś mi wytłumaczyć właśnie ten fragment kodu co dopisałem:

else if (miesiac == 2)
           {
               if ((rokPrzystepny % 4 == 0) && (rokPrzystepny % 100 != 0) || (rokPrzystepny % 400 == 0))
 
                   Console.WriteLine("Podany miesiac ma 29dni");
               else Console.WriteLine("Podany miesiąc ma 28dni");
           }
 Sadziłem że najpierw powinienem napisać:

Console.WriteLine("Podany miesiac ma 28dni");

a nie 29...?

Wcześniej napisałeś że

W przystępnym 29 a w nieprzystępnym 28
sugerowałem się tym i tak wpisałem

else 
{
//jeśli nie jest to miesiąc 2,4,6,9,11 to ma 31dni
}

o to mi chodziło: miesiąc 2 nigdy nie ma 31 dni, źle tutaj podałeś.

Przeczytaj to, przecież wejdzie tam jeśli nie jest to miesiąc 2,4,6,9,11

0

wszystko już rozumiem :) dziękuje dam1an za naprowadzenie mnie w którym miejscu co mam zrobić, żeby było prawidłowo.

0

Tylko wywal te twoje ify i else'y niepotrzebnie za każdym razem sprawdzasz czy rok jest przestępny i niepotrzebne zawsze sprawdzasz wszystkie miesiące. Użyj tego bloku ode mnie

0
            Console.WriteLine("Podaj rok");
            int rok = int.Parse(Console.ReadLine());

            bool rokPrzestepny = (rok % 4 == 0) && (rok % 100 != 0) || (rok % 400 == 0);

            if (rokPrzestepny)
                Console.WriteLine("To jest rok przestępny");
            else
                Console.WriteLine("To nie jest rok przestępny");

            Console.WriteLine("Podaj numer miesiąca");
            int miesiac = int.Parse(Console.ReadLine());

            if ((miesiac == 1) || (miesiac == 3) || (miesiac == 5) || (miesiac == 7) ||
                (miesiac == 8) || (miesiac == 10) || (miesiac == 12))
            {
                Console.WriteLine("Podany miesiąc ma 31 dni");
            }
            else if (miesiac == 2)
            {
                if (rokPrzestepny)
                    Console.WriteLine("Podany miesiac ma 29 dni");
                else
                    Console.WriteLine("Podany miesiąc ma 28 dni");
            }
            else
                Console.WriteLine("Podany miesiąc ma 30 dni");

            Console.ReadKey();   

Pierwsza sprawa to to, ze rok przestepny jest co cztery lata, wiec wystarczy sprwadzic podzielnosc przez 4;)

Ahem, masz nieaktualne dane, przegapiłeś zmianę z 1582:

Deinde, ne in posterum a XII Kalendas Aprilis aequinoctium recedat, statuimus bissextum quarto quoque anno (uti mos est) continuari debere, praeterquam in centesimis annis; qui, quamvis bissextiles antea semper fuerint, qualem etiam esse volumus annum MDC, post eum tamen qui deinceps consequentur centesimi non omnes bissextiles sint, sed in quadringentis quibusque annis primi quique tres centesimi sine bissexto transigantur, quartus vero quisque centesimus bissextilis sit, ita ut annus MDCC, MDCCC, MDCCCC bissextiles non sint. Anno vero MM, more consueto dies bissextus intercaletur, Februario dies XXIX continente, idemque ordo intermittendi intercalandique bissextum diem in quadringentis quibusque annis perpetuo conservetur.

Polskiego tłumaczenia nie mam, znalazłem po angielsku:

Then, lest the equinox recede from XII calends April [March 21st] in the future, we establish every fourth year to be bissextile (as the custom is), except in centennial years ; which always were bissextile until now; we wish that year 1600 is still bissextile; after that, however, those centennial years that follow are not all bissextile, but in each four hundred years, the first three centennial years are not bissextile, and the fourth centennial year, however, is bissextile, so the years 1700, 1800 and 1900 will not be bissextile. Assuredly, the year 2000, as with our custom, will have a bissextile intercalation, February will contain 29 days, and the same rule of intermittent bissextile intercalations in each four hundred year period will be preserved in perpetuity.

1 użytkowników online, w tym zalogowanych: 0, gości: 1