C语言程序案例(一)

 

案例来自于杜树春的书《实用有趣的C语言程序》,在学习练习的过程种我首先会自己写程序解决书中提出题目,之后再把书种的程序一字不差的边看边练。如果自己不能用程序解决问题,就直接用书中的程序练习。

1 输入年月日,计算这天星期几

具体计算公司

S=x-1+(x-1)/4-(x-1)/100+(x-1)/400+c

其中x是年份,C是这一天在这一年中累计是第多少天,(x-1)/4、(x-1)/100、(x-1)/400都是取整数部分

D=S % 7 % 7

   D是S对7取余数的结果,其值0-7分别对应星期天到星期六

下面是我写的代码

#include <stdio.h>
// 输入年月日,计算这天星期几
int main()
{
  int i,yy,mm,dd,C=0,S,day,num;
  int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  char *week[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
  printf("input year month day eg:1999 1 2\n");
  scanf("%d%d%d",&yy,&mm,&dd);
  if(yy<1 || mm<1 || mm>12 || dd >31|| dd<1)
    printf("input error: %d %d %d",yy,mm,dd);
  if(yy%4==0 && (yy%100!=0 || yy%400==0))
    month[1]=29;
  for(i=1;i<mm;i++)
    C+=month[i-1];
  C+=dd;
  S=yy-1+(yy-1)/4-(yy-1)/100+(yy-1)/400+C;
  num=S%7;
  printf("S=yy-1+(yy-1)/4-(yy-1)/100+(yy-1)/400+C\n");
  printf("%d-%d-%d is %s\n",yy,mm,dd,week[num]);
}

下面这个是参照书上的源码,感觉代码太长,可能是书前面的的案例才这样,容易理解

/*输入年月日,计算这天星期几*/
#include <stdio.h>

int main()
{
  int a,b,c,d,s,z;
  printf("请输入:年 月 日\n");
  scanf("%d%d%d",&a,&b,&c);
  if((a%4==0 && a%100!=0) || a%400==0)
    {
    if(b==1)d=c;
    if(b==2)d=c+31;
    if(b==3)d=c+60;
    if(b==4)d=c+91;
    if(b==5)d=c+121;
    if(b==6)d=c+152;
    if(b==7)d=c+182;
    if(b==8)d=c+213;
    if(b==9)d=c+244;
    if(b==10)d=c+274;
    if(b==11)d=c+235;
    if(b==12)d=c+335;
    }
  else
    {
    if(b==1)d=c;
    if(b==2)d=c+31;
    if(b==3)d=c+59;
    if(b==4)d=c+90;
    if(b==5)d=c+120;
    if(b==6)d=c+151;
    if(b==7)d=c+181;
    if(b==8)d=c+212;
    if(b==9)d=c+243;
    if(b==10)d=c+273;
    if(b==11)d=c+304;
    if(b==12)d=c+334;
    }
  s=a-1+(a-1)/4-(a-1)/100+(a-1)/400+d;
  z=s%7;
  if(z==0)printf("今天星期天.\n");
  if(z==1)printf("今天星期一.\n");
  if(z==2)printf("今天星期二.\n");
  if(z==3)printf("今天星期三.\n");
  if(z==4)printf("今天星期四.\n");
  if(z==5)printf("今天星期五.\n");
  if(z==6)printf("今天星期六.\n");
}

2 输入年月日,计算这天是这一年中的第几天

其实可以截取上面的部分程序即可,为了实现函数模块化,我练习了书中的代码,自己就没有另外编码了,如下

/*输入年月日,计算这天是本年度第几天*/
#include <stdio.h>

int main()
{
  int sum_day(int month,int day);
  int leap(int year);
  int year,month,day,days;
  printf("input: year month day\n");
  scanf("%d%d%d",&year,&month,&day);
  days=sum_day(month,day);
  if(leap(year) && month>2)
    days+=1;
  printf("%d-%d-%d is %d day of %d",year,month,day,days,year);
}

int sum_day(int month,int day)
{
  int day_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  int i;
  for(i=0;i<month-1;i++)
    day += day_table[i];
  return(day);
}

int leap(year)
{
  int mark;
  mark=year%4==0 && year%100!=0 || year%400==0;
  return(mark);
}

3 输入年月日,计算这天从1990年1月1日起算是第几天

/*输入年月日,计算这天从1990年1月1日起算是第几天*/
#include <stdio.h>
typedef struct date
{
  int year;
  int month;
  int day;
} DATA;
int countday(DATA);
int runyear(int);

int main()
{
  int totalday;
  DATA today;
  printf("输入指定的年月日(yyyy mm dd)\n");
  scanf("%d%d%d",&today.year,&today.month,&today.day);
  totalday=countday(today);
  printf("总天数是%d天\n",totalday);
  printf("总小时数是%d天\n",24*totalday);
}

int countday(DATA currentday)
{
  int i,year,totalday=0;
  int permonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  for(year=1990;year<currentday.year;year++)
    {
     if(runyear(year))
        totalday += 366;
     else
        totalday += 365;
    }
  if(runyear(currentday.year))
    permonth[1]=29;
  for(i=0;i<currentday.month-1;i++)
    totalday += permonth[i];
  totalday += currentday.day;
  return(totalday);
}

int runyear(int year)
{
  if(year%4==0 && year%100!=0 || year%400==0)
    return 1;
  else
    return 0;
}

4 输入出生年月日和现在年月日,计算一共有多少天

/*输入出生年月日和现在年月日,计算一共有多少天 */
#include <stdio.h>

int main()
{
  int year1,month1,day1,days1;
  int i,year,month,day,days,dayss=0;
  printf("输入出生年月日(yyyy mm dd)\n");
  scanf("%d%d%d",&year1,&month1,&day1);
  printf("输入现在年月日(yyyy mm dd)\n");
  scanf("%d%d%d",&year,&month,&day);
  days1=sum_day(month1,day1);
  if(leap(year1) && month1>2)
    days1 += 1;
  days=sum_day(month,day);
  if(leap(year) && month>2)
    days += 1;
  if(year1>year)
    printf("输入年份错误%d>%d",year1,year);
  else if(year1==year)
    {
     if(days1>days)
       printf("输入月份和天数错误 %d-%d > %d-%d\n",month1,day1,month,day);
     else
       {
        printf("总天数是%d天\n",days-days1);
        printf("总小时数是%d小时\n",24*(days-days1));
       }
    }
  else
    {
     for(i=year1+1;i<year;i++)
       {
        if(leap(i))
          dayss += 366;
        else
          dayss += 365;
       }
     if(leap(year1))
         dayss = dayss + days + 366 - days1;
     else
         dayss = dayss + days + 365 - days1;
     printf("总天数是%d天\n",dayss);
     printf("总小时数是%d小时\n",24*dayss);
    }
}

int sum_day(int month,int day)
{
  int i,totalday=0;
  int permonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  for(i=0;i<month-1;i++)
        totalday += permonth[i];
  totalday += day;
  return(totalday);
}

int leap(int year)
{
  if(year%4==0 && year%100!=0 || year%400==0)
    return 1;
  else
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值