21天C語言代碼訓(xùn)練營(第六天)

上一篇中打印2015年日歷的程序不知道大家是否寫出了,今天我們來用標(biāo)準(zhǔn)程序設(shè)計的思想來解決這個問題。

1. 功能分析

在程序設(shè)計過程中,我們需要把最基本的功能分析出來蔼夜,之后封裝成功能函數(shù)。這樣压昼,在最后主程序中只需要通過各種函數(shù)調(diào)用像搭積木一樣把這些功能組合起來就OK了求冷。下面我們具體看看這道題。

1.1 月份打印

打印月份是個比較麻煩的工作巢音,我們需要寫一個函數(shù)遵倦,輸入int型的月份,在屏幕中打印出相應(yīng)的月份名稱官撼。

首先梧躺,我們編程實現(xiàn)打印一年12個月份的程序。程序如下:

int main()
{
    int i;
    char month[12][10]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

    for (i = 0; i < 12; i++)
    {
        printf("%s\n", month[i]);
    }

    return 0;
}

執(zhí)行結(jié)果如下:

執(zhí)行結(jié)果

這個程序中傲绣,我們通過一個二維數(shù)組保存每個月的字母名稱掠哥,之后通過數(shù)組下標(biāo)完成相應(yīng)的月份打印。現(xiàn)在我們把核心功能進(jìn)行函數(shù)封裝秃诵。代碼如下:

char g_month[12][10] = {"January", "February", "March", "April", "May", "June",
                    "July", "August", "September", "October", "November", "December"};

// 通過月份數(shù)字打印月份名稱
void PrintMonth(int month)
{
    printf("%s", g_month[month - 1]);
}

int main()
{
   int i;
   for (i = 0; i < 12; i++)
   {
       PrintMonth(i + 1);
       printf("\n");
   }

   return 0;
}

這段代碼中的PrintMonth函數(shù)和全局變量g_month就是我們封裝的打印月份的功能续搀。

1.2 判斷閏年

知道了平年還是閏年才能知道2月份究竟是幾天。因此這個函數(shù)必不可少菠净。

// 判斷閏年禁舷,是閏年返回1,是平年返回0
int IsLeapYear(int year)
{
    if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
        return 1;
    else
        return 0;
}

1.3 判斷一年的第一天是周幾

代碼如下:

// 返回輸入年份的1月1日是周幾
int GetWeek(int year)
{
    return (35 + year + year / 4 - year / 100 + year / 400) % 7;
}

1.4 判斷每個月的天數(shù)

這里需要一個通過年份和月份判斷天數(shù)的函數(shù)毅往。代碼如下:

int g_days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// 返回輸入的年份中輸入的月份天數(shù)
int GetDays(int year, int month)
{
    if (month == 2 && IsLeapYear(year))
    {
        return g_days[month - 1] + 1;
    }
    else
    {
        return g_days[month - 1];
    }
}

又是一個全局變量和一個函數(shù)的組合牵咙,這種形式其實是數(shù)據(jù)結(jié)構(gòu)的思想,通過一個或一些函數(shù)來管理一段空間的操作攀唯。

2. 功能函數(shù)組合

正題流程如下:

  • 判斷當(dāng)年1月1日是周幾
  • 循環(huán)12個月洁桌,每個循環(huán)單元中執(zhí)行下面的工作:
    • 打印月份名
    • 打印星期表頭
    • 通過打印空格找到本月1日的具體位置
    • 計算出當(dāng)月有多少天
    • 依次打印出每一天,每7個數(shù)字一次折行

代碼實現(xiàn)中侯嘀,盡量使用前面封裝好的函數(shù)另凌。代碼如下:

#include <stdio.h>

char g_month[12][10] = {"January", "February", "March", "April", "May", "June",
                    "July", "August", "September", "October", "November", "December"};

int g_days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// 通過月份數(shù)字打印月份名稱
void PrintMonth(int month)
{
    printf("%s", g_month[month - 1]);
}

// 判斷閏年谱轨,是閏年返回1,是平年返回0
int IsLeapYear(int year)
{
    if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
        return 1;
    else
        return 0;
}

// 返回輸入年份的1月1日是周幾
int GetWeek(int year)
{
    return (35 + year + year / 4 - year / 100 + year / 400) % 7;
}

// 返回輸入的年份中輸入的月份天數(shù)
int GetDays(int year, int month)
{
    if (month == 2 && IsLeapYear(year))
    {
        return g_days[month - 1] + 1;
    }
    else
    {
        return g_days[month - 1];
    }
}

int main()
{
    int i, j, k;
    int week;
    int days;
    int year = 2015;

    // 計算當(dāng)年的1月1日是周幾的公式
    week = GetWeek(year);

   for(i = 0; i < 12; i++)
   {
       printf("\n");

       PrintMonth(i + 1);

       printf("\n");

       printf("---------------------------\n");
       printf("Sun Mon Tue Wed Thu Fri Sat\n");

       for(k = 0; k < week; k++)
           printf("    "); // 每月一號對齊它的星期數(shù)

       // 這個月的每一天和星期對齊輸出
       days = GetDays(year, i + 1);
       for(j = 1; j <= days; j++)
       {
            printf("%3d ", j);
            if(++week >= 7)
            {
                printf("\n");
                week = week % 7;
            }
        }
        printf("\n");
    }
    return 0;
}

執(zhí)行結(jié)果如下:

Part-1.png
Part-2.png
Part-3.png

今天的講解主要以代碼進(jìn)行展示吠谢,如果有問題歡迎探討土童。

3. 課后練習(xí)題

今天這個題目可以繼續(xù)追加功能,請自己完成輸入任意年份打印當(dāng)年的日歷工坊。同時娜扇,把12個月的日歷打印成6行2列。請仔細(xì)思考一下栅组。

我是天花板,讓我們一起在軟件開發(fā)中自我迭代枢析。
如有任何問題玉掸,歡迎與我聯(lián)系。


上一篇:21天C語言代碼訓(xùn)練營(第五天)
下一篇:21天C語言代碼訓(xùn)練營(第七天)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末醒叁,一起剝皮案震驚了整個濱河市司浪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌把沼,老刑警劉巖啊易,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異饮睬,居然都是意外死亡租谈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門捆愁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來割去,“玉大人,你說我怎么就攤上這事昼丑∩肽妫” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵菩帝,是天一觀的道長咖城。 經(jīng)常有香客問我,道長呼奢,這世上最難降的妖魔是什么宜雀? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮控妻,結(jié)果婚禮上州袒,老公的妹妹穿的比我還像新娘。我一直安慰自己弓候,他們只是感情好郎哭,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布他匪。 她就那樣靜靜地躺著,像睡著了一般夸研。 火紅的嫁衣襯著肌膚如雪邦蜜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天亥至,我揣著相機(jī)與錄音悼沈,去河邊找鬼。 笑死姐扮,一個胖子當(dāng)著我的面吹牛絮供,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茶敏,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼壤靶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惊搏?” 一聲冷哼從身側(cè)響起贮乳,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恬惯,沒想到半個月后向拆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡酪耳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年浓恳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碗暗。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡奖蔓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讹堤,到底是詐尸還是另有隱情吆鹤,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布洲守,位于F島的核電站疑务,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏梗醇。R本人自食惡果不足惜知允,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叙谨。 院中可真熱鬧温鸽,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蝠猬,卻和暖如春切蟋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背榆芦。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工柄粹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匆绣。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓驻右,卻偏偏與公主長得像,于是被迫代替她去往敵國和親崎淳。 傳聞我的和親對象是個殘疾皇子旺入,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,097評論 25 707
  • 繼續(xù)我們之前的項目,上一篇中我們完成了自己的String類型設(shè)計凯力,封裝了相關(guān)的功能。有朋友留言中提到C語言中有相應(yīng)...
    天花板閱讀 4,020評論 8 52
  • 上一篇中我們用項目思維把我們的程序做了大的調(diào)整礼华,收到的大部分反饋郵件都說基本能看懂咐鹤。今天我們來實現(xiàn)最后一部分功能。...
    天花板閱讀 3,893評論 17 49
  • 順著你的方向是斟滿酒的杯盞是要離岸的船只是即將倒塌的鼓樓 于一千零一夜你檠著通明的月亮來尋這滿山的坡石來尋這喧囂的...
    買金礦閱讀 501評論 8 27
  • 菠蘿大叔尋找小菠蘿的故事在村子里都傳開了,人們看著一個愛子情深的父親守望的眼神,每個人都在心里默念著,如果看到了大...
    汪八萬閱讀 1,181評論 0 1