Struct, warunek IF - miesiace

0

Witam serdecznie,
mam napisać funkcje, która będzie sprawdzać czy miesiące : February,April,June,September,Novwmber, nie mają przypadkiem 30dni, jeżeli tak to ma wyskoczyć komunikat o złej dacie.
Niestety nie wiem co mam źle - program owszem i działa, wyskakuje bład, jeżeli któryś z ww. miesiący ma 30dni, ale wyskakuje przy każdym miesiącu, jeżeli wstawimy mu 30 dni.
Tutaj cały program:

 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>
struct date
{
	int year;
	int month;
	int day;
};
bool IsValidDate(struct date a)
{
	if (a.month > 0 && a.month<13 && a.day>0 && a.day < 31)
	{

		return true;
	}
	else
	{
		return false;
	}
}
bool IsValidDate2(struct date a)
{
	if(a.month == 2 || a.day == 30 && a.day== 31 && a.month==4 || a.day==31 && a.month==6 || a.day==31 && a.month==9 || a.day ==31 &&a.month ==11 || a.day==31 )
	{
		return false;
	}
}

 void ShowDate( struct date b)
 {
	 printf("%i ", b.year);

	 switch (b.month)
 {
	 case 1:
	
			   printf("January");
			   break;
	 
	 case 2:
	 
			   printf("February ");
			   break;
	 
	 case 3:
	 
			   printf("March");
			   break;
	 
	 case 4:
	 
			   printf("April");
			   break;
	 
	 case 5:
	 
			   printf("May");
			   break;
	 
	 case 6:
	 
			   printf("June");
			   break;
	 
	 case 7:
	 
			   printf("July");
			   break;
	 
	 case 8:
	 
			   printf("August");
		   break;
	 
	 case 9:
	 
			   printf("September");
			   break;
	 
	 case 10:
	 
			   printf("October");
			   break;
	 
	 case 11:
	 
			   printf("November	");
			   break;
	 
	 case 12:
	 
			   printf("December");
			   break;
	 
		} 
		

	 printf(" %i\n", b.day);

}

main()
{
	
	struct date today; // struct date - TYPE and today - NAME
	today.year = 2014;
	today.month = 7;
	today.day = 3;
	struct date birthday = { 1995, 3, 31 };

	if (IsValidDate(birthday) && IsValidDate2(birthday))
	{

		ShowDate(birthday);
	}
	else
	{
		printf("\nBAD DATE!!\n");
	}
	
	system("PAUSE");
}

A tutaj prawdopodobnie sprawca zamiesania:

	if(a.month == 2 || a.day == 30 && a.day== 31 && a.month==4 || a.day==31 && a.month==6 || a.day==31 && a.month==9 || a.day ==31 &&a.month ==11 || a.day==31 )
 

Czy ktoś mógłby mi podpowiedzieć, co zrobić? Stworzyć więcej if'ow, gdzie każdy bedzie odpowidzialny za dany miesiąc?

Z góry bardzo dziękuję za pomoc!

0
  1. raczej powinno być:
a.month == 2 && a.day == 30 || 
  1. gdzie jest return true?

  2. ShowDate można implementować w dużo krócej:

const char* months[12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
printf("%s\n", months[b.month-1]);
  1. int main()
0

Poprawione:

bool IsValidDate2(struct date a)
{
	if(a.month == 2 && a.day == 30 || a.day== 31 && a.month==4 && a.day==31 || a.month==6 && a.day==31 || a.month==9 && a.day ==31 || a.month ==11 && a.day==31 )
	{
		return false;
	}
	else
	{
		return true;
	}
}

Zastosowałem się do powyższych wskazówek :)
Dziękuje za pomoc, niestety program w dalszym ciągu nie działa.

0

Co dokładnie znaczy nie działa? Podaj dane wejściowe i wyjściowe.

0

Testuje program tutaj : struct date birthday = { 1995, 6, 29 };
Program działa poprawnie, z tym, że dla każdego miesiąca (1-12) przy 30 dniu wyskakuje błąd "printf("\nBAD DATE!!\n");" Podejrzewam więc, że to przez funkcje IsValidDate2

Reszta działa dobrze :)

0

Co to znaczy "dla każdego miesiąca przy 30 dniu"?

http://ideone.com/znF3rw <-- wyświetla poprawnie przy 30/06/1995

0

Poprawka, przy tym if'ie :
[code] if(a.month == 2 && a.day == 30 || a.day== 31 && a.month==4 && a.day==31 || a.month==6 && a.day==31 || a.month==9 && a.day ==31 || a.month ==11 && a.day==31 )
[/code]

Program wyświetla datę nawet przy 2,4 etc. miesiącu.
Z kolei z pierwotnego ifa(tego, którego posłałem na samym poczatku tj:
if(a.month == 2 || a.day == 30 && a.day== 31 && a.month==4 || a.day==31 && a.month==6 || a.day==31 && a.month==9 || a.day ==31 &&a.month ==11 || a.day==31 )
))
program wywalał przy każdym miesiącu (od stycznia do grudnia) przy trzydziestym dniu wiadomość, że data jest zła.

Dziękuje za pomoc :)

0

Popraw post bo się zepsuł.

30 kwietnia jest ok, więc czemu ma się nie wyświetlać? Warunek mówi, że jedynie 31 kwietnia jest zły. 30 lutego powinien być zły, jeśli twierdzisz inaczej wklej kod na ideone.com i udowodnij.

0

Przepraszam za wprowadzneie w błąd... Moim jedynym usprawiedliwieniem jest mała ilość snu + piątek.
Sprawdzałem miesiące jak wyżej pisałem dla dnia trzydziestego, który jest dobry - program działa poprawnie!

Dziekuje za cierpliwość i pomoc :)

Życzę miłego wieczoru!

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