Poczatki programowania w C

Witam

Zacząłem naukę programowania w C. Dziś dla podszkolenia słabych jeszcze umiejętności postanowiłem napisać programik w ktorym podaje cyfrowo dzien, miesiac, rok, a jako wynik dostaje date (np 1 styczen 1991) ktora wpisuje oraz ile dni zostalo do konca roku. Program dziala, ale chcialbym zeby rzucil ktos okiem na to i sprawdzil, bo znajac moje umiejetnosci nie jest to optymalnie napisany program. Chcialbym dowiedziec sie jakie bledy popelnilem by ewentualnie przy pisaniu kolejnych programikow wziac pod uwage.

tutaj zamieszczam kod, poniewaz nie potrafie skopiowac z Putty teksu do jakiegokolwiek notatnika;/

http://imageshack.us/photo/my-images/580/70162246.jpg/

a tak wyglada przykladowa wklepana data oraz wynik dzialania programu

http://imageshack.us/photo/my-images/827/88295340.jpg/

Pozdrawiam

To może na początek to:

z:

http://the.earth.li/~sgtatham/putty/0.5 … html#3.1.1

Nie jest źle, ale mogło by być lepiej. Ja bym zrobił coś w ten deseń:

#include 


const short int dz[]={0,31,NULL,31,30,31,30,31,31,30,31,30,31};

const char* mies[]={"","styczen","luty","marzec","kwiecien","maj","czerwiec","lipiec","sierpien","wrzesien","pazdziernik","listopad","grudzien"};

short int d,m,r,k;


short int ilosc(int dzien, int miesiac, int rok){

	if(miesiac==2)

		if(rok%100==0)

			if(rok%400==0) return 28; 

			else return 29;

		else if(rok%4==0) return 28; 

		else return 29; 

	else return dz[miesiac];

}

int main()

{

	printf("Podaj rok w formacie dd.mm.rrrr\n");

	scanf("%d.%d.%d",&d,&m,&r);

	if(d<0 || d>ilosc(d,m,r) || m<0 || m>12)

		printf("Nieprawidlowa data");

	else

	{

		k=ilosc(d,m,r)-d;

		for(int i=m;i<12;i++)

			k+=dz[i];

		printf("Jest %d %s %dr do konca pozostalo %d dni :)",d,mies[m],r,k);

	}

}

Ogólnie:

-nie używa się zmiennych jako stałych

-scanf<< pobiera sformatowany ciąg znaków, powinieneś z tego korzystać

-pisanie każdego miesiąca ręcznie mija się z celem

-nie obsługujesz roku przestępnego

//edit rzeczywiście nie pomyślałem o tym :slight_smile:

@drobok

jak dla twoja funkcja ilość jest nieco za bardzo rozbudowana:

if(miesiac==2 && ((rok%4 == 0 && rok%100 != 0) || rok%400 == 0))

return 29;

else

return dz[miesiac];

ustawiając oczywiście tablicy liczbę dni w lutym na 28. Ewentualnie warunek na rok przestępny wrzucić do zewnętrznej funkcji.

Do tego jeszcze pasowało by uwzględnić odmianę tj.

natomiast wracając do oryginalnego kodu to ja poczekam kiedy będzie w formie tekstowej.

#include 

#include 


int main()

{


int r,m,d,t,st=30,lt=28,mr=31,kw=30,mj=31,cz=30,li=31,si=31,wr=30,pz=31,ls=31,gr=31,koniec;

printf("podaj rok: \n");

scanf("%d",&r);

printf("podaj miesiac: \n");

scanf("%d",&m);

printf("podaj dzien: \n");

scanf("%d",&d);



if(m>0 && m<13)

switch(m){

case 1:

t=365-d;

if(d>0 && d<31)

printf("%d styczen %d, zostalo %d dni do konca roku ",d,r,t);

else

printf("Nie ma takiego dnia");

break;


case 2:

t=365-d-st;

if(d>0 && d<28)

printf("%d luty %d, zostalo %d dni do konca roku ",d,r,t);

else

printf("nie ma takiego dnia");

break;


case 3:

t=365-d-(st+lt);

if(d>0 && d<31)

printf("%d marzec %d, zostalo %d dni do konca roku",d,r,t);

else

printf("nie ma takiego dnia");

break;


case 4:

t=365-d-(st+lt+mr);

if(d>0 && d<30)

printf("%d kwiecien %d, zostalo %d dni do konca roku",d,r,t);

else

printf("nie ma takiego dnia");

break;


case 5:

t=365-d-(st+lt+mr+kw);

if(d>0 && d<31)

printf("%d maj %d, zostalo %d dni do konca roku",d,r,t);

else

printf("nie ma takiego dnia");

break;


case 6:

t=365-d-(st+lt+mr+kw+mj);

if(d>0 && d<30)

printf("%d czerwiec %d, zostalo %d dni do konca roku",d,r,t);

else

printf("nie ma takiego dnia");

break;


case 7:

t=365-d-(st+lt+mr+kw+mj+cz);

if(d>0 && d<31)

printf("%d lipiec %d, zostalo %d dni do konca roku",d,r,t);

else

printf("nie ma takiego dnia");

break;


case 8:

t=365-d-(st+lt+mr+kw+mj+cz+li);

if(d>0 && d<31)

printf("%d sierpien %d, zostalo %d dnie do konca roku",d,r,t);

else

printf("nie ma takiego dnia");

break;


case 9:

t=365-d-(st+lt+mr+kw+mj+cz+li+si);

if(d>0 && d<30)

printf("%d wrzesien %d, zostalo %d dni do konca roku",d,r,t);

else

printf("nie ma takiego dnia");

break;


case 10:

t=365-d-(st+lt+mr+kw+mj+cz+li+si+wr);

if(d>0 && d<31)

printf("%d pazdziernik %d, zostalo %d dni do konca roku",d,r,t);

else

printf("nie ma takiego dnia");



case 11:

t=365-d-(st+lt+mr+kw+mj+cz+li+si+wr+pz);

if(d>0 && d<30)

printf("%d listopad %d, zostalo %d dni do konca roku",d,r,t);

else

printf("nie ma takiego dnia");

break;


case 12:

t=365-d-(st+lt+mr+kw+mj+cz+li+si+wr+pz+ls);

if(d>0 && d<31)

printf("%d grudzien %d, zostalo %d dni do konca roku",d,r,t);

else

printf("nie ma takiego dnia");

break;

}


else

printf("zle podales date\n");

}

@do grzelix dzięki, przyda sie każda wskazówka

@do drobok rzeczywiscie pisanie kazdego miesiaca to strata czasu. Teraz jak juz zobaczylem Twoj kod, wiem jak to zrobic :slight_smile: