• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 基于Win32控制臺的萬年歷的實現(上)

    標簽: C++  Win32  萬年歷

    本程序是基于Win32控制臺的,當用戶輸入要顯示日歷的年份后,會顯示該年的每一天所對應的星期,如圖1所示。

     

    1 萬年歷程序效果

    1 流程圖

    萬年歷程序的流程圖如1-1所示。


     1-1 萬年歷程序流程

    2 代碼實現

    2.1 確定要查詢年份的11

    要實現指定年份中所有12個月份的顯示,就必須要確定該年份的起始日期即11日是星期幾。前提是公元111日為星期一,之后計算從公元111日起,到指定要查詢年份的11日止,這個時間段中的天數,通過該天數得到查詢年份的11日是星期幾。

    2.1.1 獲取時間段內的天數

    1)判斷閏年

    要獲取時間段內的天數,就要判斷這個時間段內哪些年份是閏年。通過一個自定義函數實現閏年的判斷,該函數的參數是指定的年份,如果指定的年份是閏年,則函數的返回值是366,否則是365

    int IsLeapYear(int year)

    {

    if ((year % 4 == 0) && (year % 100 != 0) || year % 400 == 0)

    return 366;

    else

    return 365;

    }

    (2)獲取要顯示的年份

    通過scanf_s()函數獲取輸入的年份。

    int year;

    printf("請輸入要顯示的年份:");

    scanf_s("%d", &year);

    (3)獲取總天數

    在獲取了要顯示的年份之后,循環調用IsLeapYear()函數對時間段內的年份包含的天數進行判斷和累加,最后得到總天數。

    int days_sum;

    for (i = 1; i<y; i++)

    days_sum += IsLeapyear(i);

    2.1.2 判斷指定年份的11日是星期幾

    在獲取了時間段內的總天數之后,用該天數與7(一個星期包含7天)進行取余運算,即可得到11日是星期幾。假設星期天的值是0,星期一的值是1,依次類推:

    int start_week;

    start_week = (days_sum + 1) % 7;

    其中,days_sum是在“2.1.1”中獲取到的總天數,因為公元111日為星期一,即起點的值是1,所以需要對days_sum進行加1操作。

    2.2 循環顯示日歷標題、星期列表及1號前的空格

    從圖1中可以看到,顯示每個月份的日期時,需要顯示當前月份的名字以及星期的列表;如果當前月份的1號不是星期天,則還需要在其前面顯示空格。

    通過for循環實現指定年份12個月的遍歷。

    for (int i = 0; i<12; i = i + 1)

    {

                ........

    }

    2.2.1 顯示日歷標題

    for循環內部,i的值即為要顯示的月份數。因此,通過以下代碼顯示日歷標題,即月份數:

    printf("        %d月                 \n", i + 1);

    其中,i的值是從0開始,而月份是從1開始,所以需要對i進行加1操作。

    2.2.2 顯示星期列表

    通過printf()函數輸出字符串即可實現星期列表的顯示。

    printf("  日  一  二  三  四  五  六  \n");

    printf("=============================\n");

    2.2.3 顯示1號前面的空格

    2.1.2”中提到,start_week變量表示每個月的1號是星期幾,而日歷是從星期天開始顯示的,星期天的值是0。所以,每個月的1號是星期幾,則在1號前面就顯示幾個空格。

    for (int j = 0; j<start_week; j++)

    printf("    ");

    2.3 顯示日期

    首先定義一個整形數組,該數組中包含12個元素,分別對應12個月包含的天數。之后,判斷當前月份的天數是否已經全部顯示,如果沒有全部顯示,則繼續顯示天數。

    2.3.1 定義月份天數數組

    int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

    if (IsLeapYear(year) == 366)

    days[1] = 29;

    其中,year是要顯示的年份,如果該年份是閏年,則將2月份的天數設置為29天。

    2.3.2 判斷當前月份的天數是否已經全部顯示

    int day_month = 1;

    while (day_month <= days[i])

    {

    printf("%4d", day_month);

          day_month++;

    }

    其中,i是“2.2”中12個月的循環變量;用當前顯示的天數day_month與相應月份的天數days[i]進行比較,如果顯示的天數小于等于相應月份的天數,則說明當前月份的天數沒有全部顯示,則調用printf()函數進行顯示。

    2.4 判斷當前星期是否全部顯示

    在顯示日歷時,一個星期為一行。因此,還需要判斷當前星期是否全部顯示,如果全部顯示,則換行后繼續顯示日期。

    start_week變量表示當前日期的星期數。因此,在2.3.2”中的while()循環中,在顯示了當前日期之后,接下來對start_week進行操作,判斷當前星期是否全部顯示。

    start_week = (start_week + 1) % 7;

    if (start_week == 0)

       printf("\n");

    start_week的值是0,則說明當前日期是星期天,此時就應該換行,開始顯示下一個星期。

    #include "stdafx.h"
    #include <stdio.h>
    
    int IsLeapYear(int year)
    {
    	if ((year % 4 == 0) && (year % 100 != 0) || year % 400 == 0)
    		return 366;
    	else
    		return 365;
    }
    
    
    int main()
    {
    	int year;
    	int i, j, days_sum = 0, t = 0;
    	int day_month, start_week;
    	int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    
    	printf("請輸入要顯示的年份:");
    	scanf_s("%d", &year);
    	for (i = 1; i<year; i++)
    		days_sum += IsLeapYear(i);
    
    	start_week = (days_sum + 1) % 7;//表示該年1月1日為星期幾
    
    	if (IsLeapYear(year) == 366)
    		days[1] = 29;
    
    	printf("\n%d年日歷如下:\n\n", year);
    
    	for (i = 0; i<12; i = i + 1)
    	{
    		printf("        %d月                 \n", i + 1);
    		printf("  日  一  二  三  四  五  六  \n");
    		printf("=============================\n");
    		day_month = 1;
    		for (j = 0; j<start_week; j++)
    			printf("    ");
    		while (day_month <= days[i])
    		{
    			printf("%4d", day_month);
    			day_month++;
    			start_week = (start_week + 1) % 7;
    			if (start_week == 0)
    				printf("\n");
    		}
    		printf("\n\n");
    
    	}
    
        return 0;
    }
    


    版權聲明:本文為hou09tian原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/hou09tian/article/details/73928669

    智能推薦

    Java中calendar對萬年歷的制作(同步電腦上的萬年歷日期格式)

    Java編程中calendar對萬年歷的制作教程 使用到的方法: 1.日期類型的轉換: 2.add和roll的用法: 3.時間的設置: 使用add、roll、和設置時間時要先用靜態工廠方法獲取時間:格式 萬年歷的制作: 1.萬年歷主體結構的制作: 2.導入的包: 3.封裝help方法(操作面板設計): 4.封裝preMonth方法: 5.封裝nextMonth方法: 6.封裝preYear方法: ...

    萬年歷-java實現簡單萬年歷

    萬年歷 轉載希望標明出處,謝謝...

    基于FPGA的數字時鐘顯示(萬年歷lcd1602)

    一、  lcd1602a的驅動和配置 (1)  lcd1602a的管腳分配圖,在程序中,我們需要對相應的管腳進行操作,才能使其正確顯示 (2) 由于我使用的板子EP4CE6上的晶振是50MHZ,而lcd1602a所需要的晶振是500HZ,所以我們要想驅動他,首先要產生一個500HZ的時鐘,所以我定義了如下lcd時鐘代碼: (3) 因為lcd中存儲的字符是ASCII碼,直接寫入的...

    數組刪除其中某個對象的方法

    數組刪除其中的對象或元素,在前端是比較常見的需求。 我現在比較常用的方法如下: 這種方法只適合刪除具有唯一標識的對象。 有沒有想要脫單的小伙伴,加入我們的脫單星球,認識更多優秀的小哥哥小姐姐 特此聲明,星球是免費的,但是創建星球的時候說是必須輸入金額,所以只能先私聊,我再加你免費加入!...

    圖床搭建以及圖床工具的使用

    為什么要用圖床和圖床工具? 比較下面三種md中的圖片url地址(均免費),你會使用哪一種? 選1?由于是本地路徑,文檔分享后給其他人打開后很可能顯示圖片加載失敗。 選2?雖然分享后可以顯示圖片,但能保證加載速度? 選3?我肯定選這種,即兼容2的瀏覽器訪問,又能保證訪問速度。 這樣就可以回答上面的問題了!保證瀏覽器訪問要用圖床,保證加載速度要用圖床工具,又不花錢想想就開心。 除此之外本篇博客還會講解...

    猜你喜歡

    并發編程理論篇

    一、必備知識回顧 計算機又叫電腦,即通電的大腦,發明計算機是為了讓他通電之后能夠像人一樣去工作,并且它比人的工作效率更高,因為可以24小時不間斷 計算機五大組成部分 控制器 運算器 存儲器 輸入設備 輸出設備 計算機的核心真正干活的是CPU(控制器+運算器=中央處理器) 程序要想被計算機運行,它的代碼必須要先由硬盤讀到內存,之后cpu取指再執行 并發 看起來像同時運行的就可以稱之為并發 并行 真正...

    Java LinkedHashMap

    Java LinkedHashMap 前言 Map是我們在實際使用過程中常用的集合,HashMap在Java的實際開發中出鏡率很高,它通過hash算法實現了高效的非線程安全的集合,它有一個缺點就是,用戶插入集合的數據時無序,在我們需要一些有序的map的時候,我們就需要引入另外一個集合:LinkedHashMap。 LinkedHashMap是一個有序的非線程安全的集合,它是HashMap的子類,基...

    Spark Streaming處理文件(本地文件以及hdfs上面的文件)

    標題介紹文件流之前先介紹一下Dstream 下面是來自官網一段的說明,Discretized Streams或DStream是Spark Streaming提供的基本抽象。它表示連續的數據流,可以是從源接收的輸入數據流,也可以是通過轉換輸入流生成的已處理數據流。在內部,DStream由一系列連續的RDD表示,這是Spark對不可變的分布式數據集的抽象(有關更多詳細信息,請參見Spark編程指南)。...

    《痞子衡嵌入式半月刊》 第 8 期

    痞子衡嵌入式半月刊: 第 8 期 這里分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農歷年分二十四節氣,希望在每個交節之日準時發布一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 :《痞子衡嵌入式半月刊: 第 7 期》 嘮兩句 今天是小滿,小滿節氣意味著進入了大幅降水的雨季。痞子...

    (C++)二叉樹的線索化 / 線索二叉樹

    好久不見,朋友們!雖然我知道沒人看我的博客,但我還是想叨逼叨一下。啊,好久沒編程了(其實也就一周沒編),但你們知道,程序員一天不編程那能叫程序員么???雖然我不是程序員哈哈哈哈哈,但還是要有基本素養嘛。 繼續寫二叉樹,給自己立一個flag,就是這幾天要寫完之前沒做完的幾道題,和二叉樹紅黑樹各種樹之類的~~雖然有這個flag,但我還是很實誠地遵從自己的內心,買了一張明天的電影票,等我回來告訴你們好不...

    精品国产乱码久久久久久蜜桃不卡