2017-12-11 10 views
0

整数月と整数年を入力して1ヶ月のカレンダーを印刷するコードを記述しました。しかし、1月の1月と2月の2月のように月の単語の最初の3文字、文字で月を入力したい。写真に示すように月は文字で入力されています。 Here is the Image。だからコードを変更してください。私は文字で月を入力することができます。ありがとう入力文字の月と整数年でカレンダーを印刷

#include <stdio.h> 

int isLeapYear(int y);  /* True if leap year */ 
int leapYears(int y);   /* The number of leap year */ 
int todayOf(int y, int m, int d); /* The number of days since the beginning 
            of the year */ 
long days(int y, int m, int d); /* Total number of days */ 
void calendar(int y, int m);  /* display calendar at m y */ 

int main(void) { 
    int year, month; 

    printf("Enter the month and year: "); 
    scanf("%d %d", &month, &year); 

    calendar(year, month); 

    return 0; 
} 

int isLeapYear(int y) /* True if leap year */ 
{ 
    return(y % 400 == 0) || ((y % 4 == 0) && (y % 100 != 0)); 
} 

int leapYears(int y) /* The number of leap year */ 
{ 
    return y/4 - y/100 + y/400; 
} 

int todayOf(int y, int m, int d) /* The number of days since the beginning 
           of the year */ 
{ 
    static int DayOfMonth[] = 
    { -1/*dummy*/,0,31,59,90,120,151,181,212,243,273,304,334 }; 

    return DayOfMonth[m] + d + ((m>2 && isLeapYear(y)) ? 1 : 0); 
} 

long days(int y, int m, int d) /* Total number of days */ 
{ 
    int lastYear; 

    lastYear = y - 1; 

    return 365Q * lastYear + leapYears(lastYear) + todayOf(y, m, d); 
} 

void calendar(int y, int m) /* display calendar at m y */ 
{ 
    const char *NameOfMonth[] = { NULL/*dummp*/, 
    "January", "February", "March", "April", "May", "June", 
    "July", "August", "September", "October", "November", "December" 
    }; 
    char Week[] = "Su Mo Tu We Th Fr Sa"; 
    int DayOfMonth[] = 
    { -1/*dummy*/,31,28,31,30,31,30,31,31,30,31,30,31 }; 
    int weekOfTopDay; 
    int i, day; 

    weekOfTopDay = days(y, m, 1) % 7; 
    if (isLeapYear(y)) 
    DayOfMonth[2] = 29; 
    printf("\n  %s %d\n%s\n", NameOfMonth[m], y, Week); 

    for (i = 0; i<weekOfTopDay; i++) 
    printf(" "); 
    for (i = weekOfTopDay, day = 1; day <= DayOfMonth[m]; i++, day++) { 
    printf("%2d ", day); 
    if (i % 7 == 6) 
     printf("\n"); 
    } 
    printf("\n"); 
} 
+1

マッチを検索する月の名前の配列を持つことができます。あなたができることを試してみてください。 –

+1

"コードを変更してください。文字で月を入力できます。"どんなバグデットが利用可能ですか? – Scheff

+0

@WeatherVane面白いことに、サンプルコードにはすでに月名の配列が含まれています: 'const char * NameOfMonth []'(コードの下部にあります)。 – Scheff

答えて

1

これを実行する方法はたくさんあります。彼らは通常、入力文字列を取得し、いくつかのテーブルを参照することが含まれます。

有効な方法は、12文字列の比較ではなく、文字列入力に基づいてハッシュを計算することです。ハッシュを使用してその月の名前を調べ、それが一致するかどうかを確認します。以下のハッシュでは、月名のASCIIエンコーディングが必要です。 charは、署名されていても署名されていなくてもよい。

もちろん月の名前が変更された場合(別の言語?)、以下の特定の値とハッシュ方法は調整が必要です。

// Assume month is any 3 ASCII characters (either case) 
int month2int_chux(const char *month) { 
    if (month[0] && month[1] && month[2]) { 
    unsigned m0 = month[0] | 0x20; 
    unsigned m1 = month[1] | 0x20; 
    unsigned m2 = month[2] | 0x20; 
    unsigned m = (14 * m2)^(47 * m1); // magic computation does not use m0. 
    m %= 13; 
    const unsigned char hash[] = { 9, 11, 5, 12, 0, 7, 2, 1, 3, 4, 8, 10, 6 }; 
    m = hash[m % 13u]; 
    if (m && (NameOfMonth[m][0] | 0x20) == m0 && 
     NameOfMonth[m][1] == m1 && NameOfMonth[m][2] == m2) { 
     return m; 
    } 
    } 
    return 0; 
} 
関連する問題