C语言,求年月日

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言,求年月日相关的知识,希望对你有一定的参考价值。

C语言,求年月日貌似i%2这个算法是错误的。1 3 5 7 8 10 腊!都是31天的,其他月份都是30天。平年二月28。举个例子i%2,8%2=0。days+30+0+0 8月份算成是30天

参考技术A 首先判定年份是不是闰年,其次你使用各数组把年份的月存储下来(分闰年和平年),然后用一个循环来叠加和你输入的第二个数做笔记如果小了继续叠加,在叠加的过程中使用一个计数器,那个就是月份,当叠加的数大于那个天数了,再做差计算式那个月的第几天! 参考技术B 你要是想判断该日子是这一年的的第几天
你可以先判断是否是闰年 做个标记 比如设置个变量初始化为0如果是闰年把该变量设置为1 再把从一月到你输入的月份之前做判断 用switch就可以 一一累加
参考技术C #include <stdio.h>
#include <time.h>
#include <string.h>

int main(int argc, char *argv[])

    struct tm t;
    memset(&t, '\\0', sizeof(struct tm));
    printf("Enter Year Month Day:");
    scanf("%d %d %d", &t.tm_year, &t.tm_mon, &t.tm_mday);
    mktime(&t);
    printf("Day of the year: %d.", t.tm_yday);
    return 0;

想法偷懒,岂不妙哉 (。・∀・)ノ゛

本回答被提问者和网友采纳

求C语言编程万年历 答案合适者200分必送。

已知公元一年一月一日是星期一。计算输入的年月日是星期几?求标准C语言程序。求完整程序。

╔═══════════════════════════╗
╔══万年历查询═════════════沧海雄风制作═╗
║ 2011 年 11 月 ║
╟------┬------┬------┬------┬------┬------┬------╢
║ 日 │ 一 │ 二 │ 三 │ 四 │ 五 │ 六 ║
╟------┼------┼------┼------┼------┼------┼------╢
║ │ │ 1 │ 2 │ 3 │ 4 │ 5 ║
╟------┼------┼------┼------┼------┼------┼------╢
║ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ 12 ║
╟------┼------┼------┼------┼------┼------┼------╢
║ 13 │ 14 │ 15 │ 16 │ 17 │ 18 │ 19 ║
╟------┼------┼------┼------┼------┼------┼------╢
║ 20 │ 21 │ 22 │ 23 │ 24 │ 25 │ 26 ║
╟------┼------┼------┼------┼------┼------┼------╢
║ 27 │ 28 │ 29 │ 30 │ │ │ ║
╟------┼------┼------┼------┼------┼------┼------╢
║ │ │ │ │ │ │ ║
╚═══╧═══╧═══╧═══╧═══╧═══╧═══╝
提示:【←】减年 【→】加年 【↑】减月 【↓】加月 【ESC】退出

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>

#define CURU 72
#define CURD 80
#define CURL 75
#define CURR 77
#define ESC 27

void printWNL(int, int); //简单格式打印万年历
void printWNL2(int, int); //打印带表格的万年历
int Week(int,int,int); //求星期几
int getDays(int, int); //计算某个月的天数
int isRunNian(int); //判断是否闰年

/*
*主函数,应用程序入口
*/
void main()

int year,month;
struct tm t;
char ch;

_getsystime(&t); //标准函数, 获得系统当前时间
year = t.tm_year + 1900; //得到当前年份
month = t.tm_mon + 1; //得到当前月份
do

system("cls"); //调用DOS清屏命令
printWNL(year,month); //自定义函数, 打印万年历
ch = getch(); //获得无回显控制台输入字符

if(ch == ESC) //ESC键,退出循环,结束程序
break;
else if(ch == 0) //若值为零,则用户敲了功能键,继续获取后续代码。
ch = getch();

switch(ch)

case CURL: year--; break; //左键减年
case CURR: year++; break; //右键加年
case CURU: //上键减月
month--;
if(month == 0)

month = 12;
year--;

break;
case CURD: //下键加月
month++;
if(month == 13)

month = 1;
year++;

break;
default:;

while(1);

printf("\n\n\t谢谢使用,欢迎常来!再见。\n");


/*
*简单格式打印万年历
*参数: y 整型,接收年份值; m 整型,接收月份值;
*返回值: 无
*/

void printWNL(int y, int m)

int i,j;
int day = 1 - Week(y,m,1); //天数初始值,定位1号的位置
int days = getDays(y,m);

printf("\n\t╔═══════════════════════════╗");
printf("\n\t╔══万年历查询═════════════沧海雄风制作═╗\n");
printf("\t║ %4d 年 %2d 月 ║\n",y,m);
printf("\t╟------┬------┬------┬------┬------┬------┬------╢\n");
printf("\t║ 日 │ 一 │ 二 │ 三 │ 四 │ 五 │ 六 ║\n");

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

printf("\t╟------┼------┼------┼------┼------┼------┼------╢\n");
printf("\t║");
for(j = 1; j <= 7; j++)

if(day <= 0 || day > days)
printf(" ");
else
printf(" %2d ",day);
j < 7 ? printf("│") : i < 6 ? printf("║") : printf("║");
day++;

printf("\n");

printf("\t╚═══╧═══╧═══╧═══╧═══╧═══╧═══╝\n");
printf(" 提示:【←】减年 【→】加年 【↑】减月 【↓】加月 【ESC】退出\n");


/*
*求星期几
*参数: y 整型,接收年份值; m 整型,接收月份值; d 整型,接收天的号数
*返回值: 整型, 是0,1-6七个数之间的一个数,0代表星期日,1-6代表星期一至星期六
*/
int Week(int y,int m,int d)

int days = 0; //总天数
int i;
for(i = 1; i < y; i++) //累计1到y-1年的天数
days += isRunNian(i) ? 366 : 365;
for(i = 1; i < m; i++) //累计y年第1月到第m-1月的天数
days += getDays(y,i);
days += d; //累计当月的天数。

return days % 7; //返回星期值


/*
*判断是否闰年
*参数: y 整型, 接收年份值
*返回值: 整型, 只为0或1, 0代表假, 1代表真
*/
int isRunNian(int y)

return (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) ? 1 : 0;


/*
*计算某个月的天数
*参数: y 整型,接收年份值; m 整型,接收月份值;
*返回值: 整型, 是0, 28, 29, 30, 31之间的一个数
*注意: 返回值为0,表示你调用该函数时传递了不正确的年份值或月份值.
*/
int getDays(int y, int m)

int days = 0;
switch(m)

case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31; break;
case 4:
case 6:
case 9:
case 11:
days = 30; break;
case 2:
days = isRunNian(y) ? 29 : 28; break;
default:;

return days;

有问题请追问 满意记得采纳
参考技术A #include <stdio.h>
main()

long year,month,day;
long totalday;
int week;
int monthday[12]=0,31,59,90,120,151,181,212,243,273,304,334;
int monthdayLeap[12]=0,31,60,91,121,152,182,213,244,274,305,335;
char * weekname[7]="Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday";

printf("Please input Year Month Day:");
scanf("%ld %ld %ld",&year,&month,&day);

totalday=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400;

if((year%4==0)&&(year%100!=0)||(year%400==0))
totalday+=monthdayLeap[month-1];
else
totalday+=monthday[month-1];

totalday+=day;

week=totalday%7;

printf("%ld,%s\n",totalday,weekname[week]);

参考技术B 这个是我以前编过的简单的万年历程序,你可以看一下

#include "stdio.h"
long int f(int year,int month)
/*f(年,月)=年-1,如月<3;否则,f(年,月)=年*/
if(month<3) return year-1;
else return year;


long int g(int month)
/*g(月)=月+13,如月<3;否则,g(月)=月+1*/
if(month<3) return month+13;
else return month+1;


long int n(int year,int month,int day)

/*N=1461*f(年、月)/4+153*g(月)/5+日*/
return 1461L*f(year,month)/4+153L*g(month)/5+day;


int w(int year,int month,int day)

/*w=(N-621049)%7(0<=w<7)*/
return(int)((n(year,month,day)%7-621049L%7+7)%7);


int date[12][6][7];
int day_tbl[ ][12]=31,28,31,30,31,30,31,31,30,31,30,31,
31,29,31,30,31,30,31,31,30,31,30,31;
int main()
int sw,leap,i,j,k,wd,day;
int year;/*年*/
char title[]="SUN MON TUE WED THU FRI SAT";

printf("Please input the year whose calendar you want to know: ");/*输入年*/
scanf("%d%*c",&year);/*输入年份值和掠过值后的回车*/
sw=w(year,1,1);
leap=year%4==0&&year%100||year%400==0;/*判闰年*/
for(i=0;i<12;i++)
for(j=0;j<6;j++)
for(k=0;k<7;k++)
date[i][j][k]=0;/*日期表置0*/
for(i=0;i<12;i++)/*一年十二个月*/
for(wd=0,day=1;day<=day_tbl[leap][i];day++)
/*将第i+1月的日期填入日期表*/
date[i][wd][sw]=day;
sw=++sw%7;/*每星期七天,以0至6计数*/
if(sw==0) wd++;/*日期表每七天一行,星期天开始新的一行*/


printf("\n|==================The Calendar of Year %d =====================|\n|",year);
for(i=0;i<6;i++)
/*先测算第i+1月和第i+7月的最大星期数*/
for(wd=0,k=0;k<7;k++)/*日期表的第六行有日期,则wd!=0*/
wd+=date[i][5][k]+date[i+6][5][k];
wd=wd?6:5;
printf("%2d %s %2d %s |\n|",i+1,title,i+7,title);
for(j=0;j<wd;j++)

printf(" ");/*输出四个空白符*/
/*左栏为第i+1月,右栏为第i+7月*/
for(k=0;k<7;k++)
if(date[i][j][k])
printf("%4d",date[i][j][k]);
else printf(" ");
printf(" ");/*输出十个空白符*/
for(k=0;k<7;k++)
if(date[i+6][j][k])
printf("%4d",date[i+6][j][k]);
else printf(" ");
printf(" |\n|");

/*scanf("%*c");/*键入回车输出下一个月的日历*/


puts("=================================================================|");
puts("\n Press any key to quit...");
getch();
参考技术C 思路是:计算输入年份的1.1日距离1900年1.1过去了多少天。
然后计算过去这个天数是星期几,然后依次控制显示出去。
显示的时候,显示一二三四五六日,知道1.1是周几,那么再过去1天,2天...都知道了
#include<stdio.h>
#include<time.h>
int main(int argc,char** argv)

int year = 0;
int month = 0 ;
int day = 0 ;
int error = 0;
int leap_year_num = 0;//经历过多少个闰年
int leap =0;//输入年是否为闰年
long days = 0 ;//1900.1.1到输入年1月1日过去的天数
int i = 0;
int j = 0;
int k = 0;

printf("pls input year(xxxx):\n");
scanf("%d",&year);
printf("pls input month(1-12):\n");
scanf("%d",&month);
printf("pls input day(1-31):\n");
scanf("%d",&day);
if(month >12 )

error =1;

if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)|| (month==12))

if(day>31)

error =1;


else if(month==2)

if(((year%4==0) && (year%100 != 0))||(year%400 == 0))//判断闰年

leap =1 ;//是闰年

if(day>29)

error =1;


else

if(day>28)

error =1;



else

if(day>30)

error =1;



if(error == 1)//判断输入错误。

printf("the day %d,%d,%d is not exist",year,month,day);


printf("1\n");

for(i =year;i>0; i--)//判断1.1.1至year有多少个瑞年

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

leap_year_num++;


printf("2\n");

days = 366*leap_year_num + 365*(year - 1);//过去了的天数

for(j=1;j<month;j++)//这年里过去的月数里的总天数

if((j==1)||(j==3)||(j==5)||(j==7)||(j==8)||(j==10)|| (j==12))

days +=31;

else if(j==2)

if(leap =1 )//是闰年

days +=29;

else

days +=28;


else

days+=30;


printf("3\n");
days+=day;
printf("input is dya: %d\n",(days+1) % 7 );

看到你的同一个1900年的那个日历程序,一起做了,思路同上,这个做了入参合法的检查。
如果对你有帮助,请给分,谢谢!本回答被提问者采纳
参考技术D #include <stdio.h>
#include <stdlib.h>

#define true 1
#define false 0
const int BASEYEAR = 1990;
const int DAYSOFONEYEAR = 365;

typedef unsigned short boolean;
const int MONTHS[12] = 31, 28, 31,
30, 31, 30,
31, 31, 30,
31, 30, 31;

/*判断是否是闰年*/
boolean isLeepYear(int year);
void prompt(int *year);
int crossLeepYears(int year);
int crossDays(int year, int month);
int startWith(int year, int month);
void printMonth(int year, int month);
void printMonths(int month);
void printBlack();
void printTitle(int month);

int main(int argc, char *argv[])

int year = 0;
prompt(&year);
printMonths(year);
return 0;


int crossLeepYears(int year)

int i = -1;
int count = 0;
for (i = BASEYEAR; i < year; ++i)

if (isLeepYear(i))

++count;


return count;


int crossDays(int year, int month)

int days = 0;
int i = 0;
days = (year - BASEYEAR)*DAYSOFONEYEAR + crossLeepYears(year);
if (month > 2 && isLeepYear(year))

++days;

for (i = 0; i < month-1; ++i)

days += MONTHS[i];

return days;


int startWith(int year, int month)


return ((crossDays(year, month)+1))%7;


void prompt(int *year)

printf("Please inpu the year: ");
scanf("%d", year);


boolean isLeepYear(int year)

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

return true;

return false;


void printMonths(int year)

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

printMonth(year, i+1);



void printMonth(int year, int month)

int i = 0;
int day = 1;
int startDay = startWith(year, month);
int daysOfMonth = MONTHS[month-1]+startWith(year, month);
if (isLeepYear(year))

++daysOfMonth;

printTitle(month);
for (i = 0; i < daysOfMonth; ++i)

if (i<startDay)

printf(" ");
continue;

printf ("%2d", day++);
printBlack();
if ((i+1)%7==0)

putchar('\n');


putchar('\n');


void printBlack()

printf(" ");


void printTitle(int month)

printf("\n\t");
switch (month)

case 1:
puts("一月");
break;
case 2:
puts("二月");
break;
case 3:
puts("三月");
break;
case 4:
puts("四月");
break;
case 5:
puts("五月");
break;
case 6:
puts("六月");
break;
case 7:
puts("七月");
break;
case 8:
puts("八月");
break;
case 9:
puts("九");
break;
case 10:
puts("十月");
break;
case 11:
puts("十一月");
break;
case 12:
puts("十二月");
break;
default:
break;

puts("日 一 二 三 四 五 六");

以上是关于C语言,求年月日的主要内容,如果未能解决你的问题,请参考以下文章

c语言怎么求两个日期相差的秒数,日期格式20140325150630和20140324150000

如何用C语言编写一个求年龄的程序

怎样用c语言编写以年月日的格式输入一个人的生日和当前日期,来计算这个人的年龄

C语言~时间函数

求C语言编程万年历 答案合适者200分必送。

用C语言求:写一个函数,从给定的身份证号中提取出生年月信息,并按日期格式输出。