您的位置:

c语言后序日期,计算后续日期c语言

本文目录一览:

C语言 日期(年月日 ) 排序

#include "stdio.h"

#include "string.h"

//日期结构体

struct date

{

int y;//年

char m[4];//月

int d;//日

};

//比较年份

int cmpY(int a, int b)

{

//年份在90-10之间,代表1990年到2010年

if (a 100 a 10)

a +=1900;

else

a += 2000;

if (b 100 b 10)

b +=1900;

else

b += 2000;

if (a b)

return 1;

else if (a == b)

return 0;

else

return -1;

}

//比较月份

int cmpM(char *a, char *b)

{

//定义字符串数组,表示12个月份的英文

char m[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

int i, j;

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

if (strcmp(a,m[i]) == 0)

break;

for (j = 0; j 12; j++)

if (strcmp(a,m[j]) == 0)

break;

if (i j)

return 1;

else if (i == j)

return 0;

else

return -1;

}

//综合年,月,日比较

int cmpYMD(struct date a, struct date b)

{

if (cmpY(a.y,b.y) == -1)

return -1;

else if (cmpY(a.y,b.y) == 1)

return 1;

else

{

if (cmpM(a.m,b.m) == -1)

return -1;

else if (cmpM(a.m,b.m) == 1)

return 1;

else

{

if (a.d b.d)

return 1;

else if(a.d == b.d)

return 0;

else

return -1;

}

}

}

void main()

{

//定义结构体数组

struct date dt[3]={

{ 0, "Jan", 11},

{99, "Feb", 22},

{ 8, "Mar", 2}};

struct date dtTemp;

int i, j;

//排序

for (i = 0; i 3-1; i++)

for (j = i+1; j 3; j++)

if (cmpYMD(dt[i],dt[j]) == 1)

{

dtTemp = dt[i];

dt[i] = dt[j];

dt[j] = dtTemp;

}

//输出排序过后的日期

for (i = 0; i 3; i++)

{

printf("%d %s %d\n",dt[i].y,dt[i].m,dt[i].d);

}

}

c语言输入一个日期,计算这个日期前一天和后一天的日期。怎么解答?

#include stdio.h

#include conio.h

/* 日期存储结构 */

typedef struct date {

int year; /* 年 */

int month; /* 月 */

int day; /* 日 */

} date;

int dpm[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; /* 平年每月天数 */

/* 判断闰年 1:是; 0:否 */

/* 闰年特点:年份是4的倍数但不是100的倍数、年份是400的倍数 */

int isLeap (int year) {

    return (year%4==0  year%100!=0) || (year%400==0);

}

/* 日期校验 */

/* 日期错误返回1,正确返回0 */

int dateIsErr (date d) {

if (d.year1582  d.month10  d.day15) /* 仅支持1582年10月15日之后的日期计算 */

return 1;

if (d.month 1 || d.month 12) /* 月校验 */

return 1;

if (d.day1 || d.day31) /* 日初步校验 */ 

return 1;

if (d.month!=2  d.daydpm[d.month]) /* 非2月日校验 */ 

return 1;

if (d.month==2  isLeap (d.year)  d.day29) /* 2月闰年日校验 */

return 1;

if (d.month==2  isLeap (d.year)==0  d.day28) /* 2月平年日校验 */

return 1;

return 0;

}

/* 计算与日期start相差delta天的日期 */

date dateDelta (date start, int delta) {

date end = start;

if (delta=0) { /* 日期start向后计算 */

end.day = start.day + delta; /* start日加intervalDays天 */

while (end.day  dpm[end.month]) { /* 不断减去整月天数,向月、年进位,直至其不超过当前月份天数 */

end.day -= dpm[end.month];

if (isLeap (end.year)  end.month==2) /* 闰年2月天数-1 */

end.day--;

end.month++; /* 月进位+1 */

if (end.month == 13) { /* 满1年 */

end.year++; /* 年进位+1 */

end.month = 1; /* 月归位至1月 */

}

}

}

else { /* 日期start向前计算 */

end.day = start.day + delta; /* start日加intervalDays天 */

while (end.day  1) { /* 不断加整月天数,向月、年借位,直至其不小于1 */

end.month--; /* 月借位-1 */

if (end.month == 0) { /* 向年借位 */

end.year--; /* 年借位-1 */

end.month = 12; /* 月归位至12月 */

}

end.day += dpm[end.month];

if (isLeap (end.year)  end.month==2) /* 闰年2月天数+1 */

end.day++;

}

}

return end;

}

int main (void) {

date start = {2008,5,6}, end;

int delta;

if (dateIsErr (start)) {

printf ("日期错误!\n");

}

else {

printf ("\t%4d年%2d月%2d日\n", start.year, start.month, start.day);

delta = 1;

end = dateDelta (start, delta);

printf ("向后\t1天\n");

printf ("是\t%4d年%2d月%2d日\n", end.year, end.month, end.day);

delta = -1;

end = dateDelta (start, delta);

printf ("向前\t1天\n");

printf ("是\t%4d年%2d月%2d日\n", end.year, end.month, end.day);

}

getch (); /*屏幕暂留*/

    return 0;

}

输入日期部分,题主自己写吧。以上是核心代码。

C语言 排序 时间?

#include "stdio.h"

#include "string.h"

//日期结构体

struct date

{

char y[3];//年

char m[4];//月

int d;//日

};

//新增加,将字符串表示的年份转成整形表示

int intY(char *a)

{

int k = 0;

k += a[0] - '0';//十位上的数值

k = k*10 + (a[1] - '0');//十位上的数值乘以10再加上个位上的数值

return k;

}

//比较年份(修改后,参数类型变了)

int cmpY(char *y1, char *y2)

{

//新增加两条语句

int a = intY(y1);

int b = intY(y2);

//年份在90-10之间,代表1990年到2010年

if (a 10)

a += 1900;

else

a += 2000;

if (b 10)

b += 1900;

else

b += 2000;

if (a b)

return 1;

else if (a == b)

return 0;

else

return -1;

}

//比较月份

int cmpM(char *a, char *b)

{

//定义字符串数组,表示12个月份的英文

char m[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

int i, j;

for (i = 0; i b.d)

return 1;

else if(a.d == b.d)

return 0;

else

return -1;

}

}

}

void main()

{

//定义结构体数组

struct date dt[3]={

{"00", "Jan", 11},

{"99", "Feb", 22},

{"08", "Mar", 2}};

struct date dtTemp;

int i, j;

//排序

for (i = 0; i 3-1; i++)

for (j = i+1; j 3; j++)

if (cmpYMD(dt[i],dt[j]) == 1)

{

dtTemp = dt[i];

dt[i] = dt[j];

dt[j] = dtTemp;

}

//输出排序过后的日期

for (i = 0; i 3; i++)

{

//修改输出格式

printf("%s %s %d\n",dt[i].y,dt[i].m,dt[i].d);

}

}

c语言问题 计算后续日期

修改后如下:

#include stdio.h

#include stdlib.h

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

{

 int y,m,d,N,a;

 scanf("%d %d %d",y,m,d);

 scanf("%d",N);

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

 {

  a=31-d;

 }else if(m==4||m==6||m==9||m==11)

 {

  a=30-d;

 }else if(m==2)

 {

  if((y%4==0y%100!=0)||y%400==0)

  {

   a=29-d;

  }else

  {

   a=28-d;

  }

 }

 if(N=a)

 {

  printf("%d %d %d",y,m,d+N);

 }else

 {

  N=N-a;

  m++;

 }

 for(;N0;)

 {

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

  {

   N=N-31;

   m++;

  }else if(m==4||m==6||m==9||m==11) 

  {

   N=N-30;

   m++;

  }else if(m==2)

  {

   if((y%4==0y%100!=0)||y%400==0)

   {

    N=N-29;m++;

   }else

   {

    N-=28;

    m++;

   }

  }else if(m==13) 

  {

   y++;

   N-=31;

   m=2;

  }

 }

 m--;

 if(m==1)

 {

  printf("%d.%d.%d\n",y,m=12,N+31);

 }else if(m==3||m==5||m==7||m==8||m==10||m==12)

 {

  printf("%d.%d.%d\n",y,m,N+31);

 }else if(m==4||m==6||m==9||m==11)

 {

  printf("%d.%d.%d\n",y,m,N+30);

 }else if(m==2)

 {

  if((y%4==0y%100!=0)||y%400==0) 

  {

   printf("%d.%d.%d\n",y,m,N+29); 

  }else

  {

   printf("%d.%d.%d\n",y,m,N+28);

  }

 }

 system("PAUSE"); 

 return 0;

}

但你这个程序输入2014 1 1   -1就会出现2014 1 0,需要改进。

C语言 计算后续日期

#include stdio.h

#include stdlib.h

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

{

 int y,m,d,N,a;

 scanf("%d %d %d",y,m,d);

 scanf("%d",N);

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

 {

  a=31-d;

 }else if(m==4||m==6||m==9||m==11)

 {

  a=30-d;

 }else if(m==2)

 {

  if((y%4==0y%100!=0)||y%400==0)

  {

   a=29-d;

  }else

  {

   a=28-d;

  }

 }

 if(N=a)

 {

  printf("%d %d %d",y,m,d+N);

 }else

 {

  N=N-a;

  m++;

 }

 for(;N0;)

 {

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

  {

   N=N-31;

   m++;

  }else if(m==4||m==6||m==9||m==11) 

  {

   N=N-30;

   m++;

  }else if(m==2)

  {

   if((y%4==0y%100!=0)||y%400==0)

   {

    N=N-29;m++;

   }else

   {

    N-=28;

    m++;

   }

  }else if(m==13) 

  {

   y++;

   N-=31;

   m=2;

  }

 }

 m--;

 if(m==1)

 {

  printf("%d.%d.%d\n",y,m=12,N+31);

 }else if(m==3||m==5||m==7||m==8||m==10||m==12)

 {

  printf("%d.%d.%d\n",y,m,N+31);

 }else if(m==4||m==6||m==9||m==11)

 {

  printf("%d.%d.%d\n",y,m,N+30);

 }else if(m==2)

 {

  if((y%4==0y%100!=0)||y%400==0) 

  {

   printf("%d.%d.%d\n",y,m,N+29); 

  }else

  {

   printf("%d.%d.%d\n",y,m,N+28);

  }

 }

 system("PAUSE"); 

 return 0;

}

C语言判断两个日期的前后问题

if(dt1.year!=dt2.year)

{

if(dt1.yeardt2.year) return 1;                    //判断年相等否

if(dt1.yeardt2.year) return -1;

}

比如这里,如果两个year相等,就没有返值(当然,这是编译器的判断逻辑),编译器不会根据你上下文去统计逻辑的,因此会认为你if有返值,没有else语句中的返值。你将两个逻辑中的连续if改成if  else应该就没问题了。

其实,如果年月日的规则是严格的,那么语句不用这么麻烦,直接判断

year*365+month*30+day 的大小即可判定两个日期的关系了。