PDA

Visualizza la versione completa : [C] errore con la stampa di un calendario


maseeeeeee
17-08-2014, 16:03
Salve a tutti eccomi di nuovo qui.Sto svolgendo un esercizio che inserito un anno da tastiera mi stampi il calendario corretto.Ora posto il codice ,la mia difficolta far stampare esattamente il numero preciso sotto il giorno ,in poche parole il primo giorno del mese viene stampato sempre sotto Domenica!!! Non so come fare !!Grazie in anticipo!!!
#include<stdio.h>
#define annoiniziale 1752
int main(){
int anno;
int inizio;
int mese=1;
int giorno=1;
int colonna=0;

printf("inserire anno: ");
scanf("%d",&anno);







while(mese<=12){
giorno=1;
if (mese==1){
printf("GENNAIO\n");
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAb\t\n");
}
else if(mese==2){
printf("FEbbRAIO\n");
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAb\t\n");
}
else if(mese==3){
printf("MARZO\n");
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAb\t\n");
}
else if(mese==4){
printf("APRILE\n");
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAb\t\n");

}
else if(mese==5){
printf("MAGGIO\n");
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAb\t\n");
}
else if(mese==6){
printf("GIUGNO\n");
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAb\t\n");
}
else if(mese==7){
printf("LUGLIO\n");
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAb\t\n");
}
else if(mese==8){
printf("AGOSTO\n");
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAb\t\n");
}
else if(mese==9){
printf("SETTEMbRE\n");
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAb\t\n");
}
else if(mese==10){
printf("OTTObRE\n");
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAb\t\n");
}
else if(mese==11){
printf("NOVEMbRE\n");
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAb\t\n");
}
else if(mese==12){
printf("DICEMbRE\n");
printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAb\t\n");
}
switch(mese){
case 4: case 6: case 9: case 11:
while(giorno<=30){
colonna=0;
while(colonna<=6){
if(giorno>30){
break;
}
else{
printf("%d\t",giorno);
colonna++;
giorno++;
}
}
printf("\n");
}
printf("\n");
mese++;
break;
case 1: case 3: case 5:case 7: case 8: case 10: case 12:
while(giorno<=31){
colonna=0;
while(colonna<=6){
if(giorno>31){
break;
}
else{
printf("%d\t",giorno);
colonna++;
giorno++;
}
}
printf("\n");
}
printf("\n");
mese++;
break;
case 2:
if(anno%400==0){
while(giorno<=29){
colonna=0;
while(colonna<=6){
if(giorno>29){
break;
}
else{
printf("%d\t",giorno);
colonna++;
giorno++;
}
}
printf("\n");
}
printf("\n");
mese++;
}
else{
while(giorno<=28){
colonna=0;
while(colonna<=6){
if(giorno>28){
break;
}
else{
printf("%d\t",giorno);
colonna++;
giorno++;
}
}
printf("\n");
}
printf("\n");
mese++;
}
break;
}
}
return 0;
}

Vincenzo1968
18-08-2014, 20:28
In buona sostanza devi calcolare il giorno della settimana relativo al primo giorno del mese di gennaio dell'anno considerato e stampare tanti tab quanti ne occorrono per posizionare il giorno corrispondente nella colonna giusta:



...
dblDay = CalendarDateToJulianDay(anno, mese, giorno);

colonna = DayOfTheWeek(dblDay);

for ( x = 0; x < colonna; x++ )
printf("\t");
...





#include <stdio.h>

#define annoiniziale 1752

int myal_IsJulianDate(int year, int month, int day)
{
if ( year > 1582 )
return 0;

if ( month > 10 )
return 0;

if ( day > 4 )
return 0;

return 1;
}

double CalendarDateToJulianDay(int year, int month, int day)
{
double Y, M, D;
double A, B;

B = 0;

D = day;

if ( month <= 2 )
{
Y = year - 1;
M = month + 12;
}
else
{
Y = year;
M = month;
}

if ( !myal_IsJulianDate(year, month, day) )
{
A = (int)(Y/100);
B = 2 - A + (int)(A/4);
}

return ( (int)(365.25 * (Y + 4716)) + (int)(30.6001 * (M + 1)) + D + B - 1524.5 );
}

int DayOfTheWeek(double jd)
{
int num = (int)(jd + 1.5);
int retValue = num % 7;

return retValue;
}

int IsLeapYear(int year)
{
if ( year % 4 != 0 )
{
return 0;
}
else
{
if ( year % 100 != 0 )
return 1;
else if ( year % 400 != 0 )
return 0;
else
return 1;
}
}

void PrintCalendar(int year)
{
int anno = year;
int mese = 1;
int giorno = 1;
int colonna = 0;
double dblDay;
int x;

int giorniMese[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

if ( IsLeapYear(anno) )
giorniMese[2] = 29;

while(mese <= 12)
{
giorno = 1;

switch ( mese )
{
case 1:
printf("GENNAIO\n");
break;
case 2:
printf("FRBBRAIO\n");
break;
case 3:
printf("MARZO\n");
break;
case 4:
printf("APRILE\n");
break;
case 5:
printf("MAGGIO\n");
break;
case 6:
printf("GIUGNO\n");
break;
case 7:
printf("LUGLIO\n");
break;
case 8:
printf("AGOSTO\n");
break;
case 9:
printf("SETTEMBRE\n");
break;
case 10:
printf("OTTOBRE\n");
break;
case 11:
printf("NOVEMBRE\n");
break;
case 12:
printf("DICEMBRE\n");
break;
}

printf("\n");
printf("DOM\tLUN\tMAR\tMER\tGIO\tVEN\tSAB\t\n");


dblDay = CalendarDateToJulianDay(anno, mese, giorno);

colonna = DayOfTheWeek(dblDay);

for ( x = 0; x < colonna; x++ )
printf("\t");

while( giorno <= giorniMese[mese]){
while( colonna <= 6){
if( giorno > giorniMese[mese] ){
break;
}
else{
printf("%d\t",giorno);
colonna++;
giorno++;
}
}
printf("\n");
colonna = 0;
}
printf("\n");
mese++;
}
}

int main()
{
int anno;

printf("inserire anno: ");
scanf("%d",&anno);

PrintCalendar(anno);

return 0;
}

Loading