❶ 萬年歷c語言
// 萬年歷.cpp : Defines the entry point for the console application.
// 顯示1900年以後任何年份的日歷,日歷以月份順序排列,每月以星期順序排列。
//採用一般日歷計算方法,先給出一般年份的每月天數,如果是閏年,第二個月天數為29,再計算出制定年份的1月1日是星期幾,然後根據這些數據
//計算出全年日歷,邊計算邊顯示。
//函數leap()判定是否閏年
//函數week()計算year年份的1月1日是星期幾。計算方法是,已知1900年1月1日是星期一,先計算從1900年到year年份的前一年一共有多少(s)天,
//則(s+1)%7為年份year的1月1日的星期號。
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
static char *week0=" SUN MON TUE WED SUR FRI SAT"; //指針形式定義一個字元串,或者是week0[36]
int leap(int year)
{
if((year%4==0 && year%100!=0)|| year%400==0)
return 1;
else return 0;
}
int week(int year)
{
int i,w;
int s=0;
for(i=1900;i<year;i++)
{
if(leap(i))
s+=366;
else s+=365; //計算從1900年到year年的天數
}
w=(s+1)%7;
return w;
}
void main()
{
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int i,j,k;
int year;
int w;
do
{
cout<<"輸入年份:";
cin>>year;
}while(year<=1900);
w=week(year);
if(leap(year))
month[1]=29;
for(i=0;i<12;i++)
{
for(k=0;k<35;k++)
cout<<"_"; //輸出一條橫線
cout<<endl;
cout<<setw(20)<<i+1<<"月"<<endl;
cout<<endl;
cout<<week0<<endl;
for(k=0;k<w;k++)
cout<<" "; //輸出若干空格
for(j=1;j<=month[i];j++)
{
if((j+w)%7==1) //遇到星期日時,換一行輸出
cout<<endl;
cout<<setw(5)<<j;
}
cout<<endl;
for(k=0;k<35;k++)
cout<<"_"; //輸出一條橫線
cout<<endl;
w=(w+month[i])%7; //計算下個月1號是星期幾
}
cout<<endl;
system("pause");
}
❷ 用C語言寫萬年歷
寫萬年歷程序,您需要先了解萬年歷的特點
下面是萬年歷的特點(復制粘貼的):
1. 平年365天(52周+1天),閏年366天(52周+2天)。平年2月28天,閏年2月29天。
由於公元1月1日設為星期六,故3月1日為星期三。 ——注意這個「三」
為使演算法達到最簡,故本演算法以「星期」為計算單位。且選3月1日為基月。
2. 每400年整一閏,或每4年且不為百年的一閏。(原因:地球繞太陽一周的時間是365天5小時46秒,為了使一年的天數為整數,將一年的天數定為365天,餘下的時間積累起來,四年就是23小時15分4秒,將近一天,把這一天加在某年的二月而成29天,該年稱為閏年,其它年稱為平年。但四年加一天又多用了44分56秒,這個數積滿400年為三天。因此400年中只能有97個閏年,所以凡能被400整除,或不能被100整除但能被4整除的年份為閏年。)
所以百年%4=0閏或(年%4=0並且年<>0)閏。
3. 每 4年(3個平年+1個閏年)共208周+5天 ——注意這個「5天」
每百年共100*(208周+5天)-1天=5217周+5天 ——注意這個「5天」(整百年暫設為平年)
每400年共4*(5217周+5天)+1天(整400年閏)=20871周+0天——注意這個「0天」和「1天」(4個整百年只有一個閏年)
即400年一輪回!(原來萬年歷400年前是一家)
至於你說的日期和星期對齊,給你一點思路參考:每一行是7天,可以設定每一天佔10個字元(同時上面的星期也得占滿10個字元),假設本月第一天是星期4,那麼在輸出1之前需要先輸出10×3個字元來佔位,當輸出星期天的日期之後換行,之後的就簡單了
寫了這么多 希望能幫到你
❸ C語言萬年歷項目概述(如何做這個項目)
首先,打開VC++6.0,依次選取「File(中文版的為『文件』,以後不再提示)」——>「New(新建)」菜單項,打開New窗口後,選取Projects(工程)選項卡,再選取MFC AppWizard(exe)項,先在Location(位置)編輯框中輸入工程地址,再在Project name(工程)編輯框中輸入工程文件名,單擊「OK(確定)」按鈕,在打開的新窗口中選取Dlalog based(基本對話)單選鈕,單擊finish(完成)按鈕,再在打開的新窗口中單擊OK(確定)按鈕即可創建一個空白的對話框,刪除其中不需要的控制項,再在上面拉出一個Date Time Picker控制項,再單擊運行按鈕即可。
❹ C語言程序 關於萬年歷程序的問題~~~
int
firstday(int
y)
//判斷某年元旦是星期幾
{
double
s
;
s=floor(year-1+(year-1)/4.0-(year-1)/100.0+(year-1)/400.0+1);
return
(int)s%7;
}
這個函數寫錯了,2013年錯了一天,另外用
浮點數
,肯定有問題。
❺ 求C語言程序(萬年歷)講解
你的代碼一共有如下幾個問題:
1.
你使用scanf("%c",&a)來接收用戶輸入的一個字元時,會將回車符也接收下來。C語言在處理時,會將用戶輸入放在鍵盤緩沖區,使用scanf來接收%c時,編譯器從鍵盤緩沖區讀取一個char字元,但是並不清空後面的字元,所以導致下一次scanf("%c",&a)時,將剩下的回車符先給讀進來,並進行處理了。
要解決這個問題,可以使用getch()或者getche()函數。
但是:
getch()介面,接收字元後不會將字元回顯到顯示器,所以用戶看不到自己輸入的字元。
而getche()介面就沒有這個問題,所以應該使用getche()。
2.
循環計數錯誤,多循環一次。
這個你仔細推算一下就出來了。
一般解決這種問題的話,使用do/while循環較多,因為do/while循環可讀性好一些。
以下是改過以後的代碼,已經編譯運行確認:
#include
<stdio.h>
#include
<conio.h>
main()
{
char
a;
int
i=3;
a=getche();//這里使用getche()來接收用戶輸入,既可以回顯,也不會接收回車
do
{
i--;//將i--放在這里,防止出現可以輸入4次的情況
if(a!='b'&&i>0)
{
printf("錯誤\n");
a=getche();//這里使用getche()來接收用戶輸入,既可以回顯,也不會接收回車
}
else
break;
}while(1);
if(a=='b')
{
printf("正確");
}
else
getch();
}
❻ 用C語言編萬年歷要注意什麼!!!高手請指點!!!
該公式是:
(年+年/4+年/400-年/100+月日天數-1)/7=XX……余。余數為星期幾。
其中:(年+年/4+年/400-年/100)/7=XX……余。余數為該年1月1日星期數。(註:分數和商數均取整數)
但是月日天數有規則:
月日天數: 平年 , 閏年
一 月: 0+日數, 0+日數
二 月: 3+日數, 3+日數
三 月: 3+日數, 4+日數
四 月: 6+日數, 0+日數
五 月: 1+日數, 2+日數
六 月: 4+日數, 5+日數
七 月: 6+日數, 0+日數
八 月: 2+日數, 3+日數
九 月: 5+日數, 6+日數
十 月: 0+日數, 1+日數
十 一 月: 3+日數, 4+日數
十 二 月: 5+日數, 6+日數
(註:月日天數為前各月累積7餘數+當月天數,可查算,也可心算。)
例:2005年(平年)10月1日星期幾?
(年+年/4+年/400+年/100+月日天數-1)/7
=(2005+2005/4+2005/400-2005/100+(0+1)-1)/7
=(2005+501+5-20+1-1)/7
=2491/7
=XX……6
即該年10月1日為星期六。
❼ c語言編寫萬年歷
#include"stdio.h"
#include"stdlib.h"
#include"windows.h"
void welcome();
void getday(int year,int month);
void shuru();
void end();
long year;
long month;
void welcome()
{
printf("【萬年歷程序載入中");
for(int i=0;i<30;i++)
{
printf("★");
Sleep(100);
}
system("cls");
printf("【萬年歷程序載入中】\n");
Sleep(1000);
printf("☆~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☆\n");
Sleep(1000);
printf(" ~~~謝謝使用【菠菜】製作的萬年歷~~~~\n");
Sleep(100);
printf("☆~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☆\n");
Sleep(1000);
}
void end()
{
printf("【萬年歷關閉中");
for(int i=0;i<30;i++)
{
printf("★");
Sleep(100);
}
system("cls");
printf("【萬年歷關閉完成】\n");
Sleep(1000);
printf("☆~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☆\n");
Sleep(1000);
printf(" ~~~謝謝使用【菠菜】製作的萬年歷~~~~\n");
Sleep(100);
printf("☆~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☆\n");
Sleep(1000);
exit(0);
}
void shuru()
{
int a;
printf("☆~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☆\n");
printf(" ≮歡迎使用萬年歷≯\n");
printf("☆~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☆\n");
while(1)
{
printf("請輸入年份:");
scanf("%d",&year);
if(year>0)
break;
else
{
printf("\n");
printf("你輸入的年份有誤,請重新輸入\n"); } }
printf("\n");
while(1)
{
printf("請輸入月份:");
scanf("%d",&month);
if(month>=1&&month<=12)
break;
else
{
printf("\n");
printf("你輸入的月份有誤,請重新輸入\n"); } }
getday(year,month);
}
void getday(int year,int month)
{
int week; //星期幾
int nowday=0; //該月前的總天數
long allday; //從公元1年起的總天數
int dayofmonth[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(year%4==0&&year%100!=0||year%400==0)
dayofmonth[2]=29;
for(int m=0;m<month;m++)
{
nowday=nowday+dayofmonth[m];
}
allday=nowday+year*365+year/4-year/100+year/400; //公元一年到現在用了多少天
week=allday%7; //求出這個月第一天是星期幾
printf(" %d 年 %d 月\n",year,month);
printf("日 一 二 三 四 五 六\n");
for(int j=0;j<week;j++)
{
printf(" ");
}
for(int i=1;i<=dayofmonth[month];i++)
{
if(week==7)
{
printf("\n");
week=0; }
printf("%2d ",i);
week++; }
printf("\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
}
void main()
{
char a;
welcome();
while(1)
{
shuru();
printf("你還需要繼續嗎?<y ro n>");
fflush(stdin); //清空輸入緩沖區,避免緩沖區內殘存讀取函數無法取走的內容!
scanf("%c",&a);
if(a=='n')
break;
}
end();
}
這個萬年歷比較好看哈!你可以試試這個?
❽ 求個C語言綜合實驗設計報告,包括設計題目,題目闡述及設計思路,主要知識點,程序清單,設計結果優缺點
題目: C語言輸出萬年歷
學院:
專業:
班級:
姓名:
設計日期:總分:
一、設計題目:
C語言輸出萬年歷
二、題目闡述及設計思路:
C語言輸出萬年歷,輸入年份、月份,計算得到的是這一天是星期幾;給定年,月,計算此月有多少天 。本程序運用的萬年歷的計算公式: d=a-1+(a-1)/4-(a-1)/100+(a-1)/400+c; 其中a為年c為該日期在本年中的天數,d取整數,當d/7餘數0時是星期天,余數1時是星期一依此類推。
三、主要知識點:
運用函數調用,if,else函數switch語句。for,while,循環語句。
四、程序清單:
#include <stdio.h>
int m_day(int year,int month)/*此函數是給定年,月,計算此月有多少天.*/
{
if ((year%4==0 &&year%100!=0) ?? (year%400==0))
switch(month)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;
case 4: case 6: case 9: case 11: return 30;
case 2: return 29;
}
else
switch(month)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;
case 4: case 6: case 9: case 11: return 30;
case 2: return 28;
}
}
int main()
{
int year,month;
int i, days=0, d, day=0;
printf ("Enter the year and month:\n");
scanf ("%d %d ", &year, &month );
for (i=1;i<month; i++)
days+=m_day (year,i);
d=year-1+(year-1)/4-(year-1)/100+(year-1)/400+days+1;
printf("%d-%d\n",year,month);
printf(" Sun Mon Tue Wed Thu Fri Sat\n");
for (i=0;i<d%7;i++)
printf(" ");
for (i=1;i<=7-d%7;i++)
{
day++;
printf("%5d",day);
}
printf("\n");
while(1)
{
for (i=1;i<=7;i++)
{
day++;
if (day>m_day(year,month)) {getch();return 0;}
printf("%5d",day);
}
printf("\n");
}
}
五、設計結果說明:
1、設計優點:
程序充分利用所學的C語言知識,運用了函數的調用、循環語句、以及return語句,使得編程更加有條理。簡單易懂,結構清晰,也使得程序的使用更加方便。
2、設計不足:
在編程序時,由於考慮到時間和受所學知識的限制,只能輸入年份、月份,計算得到的是這一天是星期幾;給定年,月,計算此月有多少天 。而並不能輸入公歷的年月日,輸出農歷年月日以及輸入農歷節氣,輸出當年農歷的年月日及公歷年月日。