求解 C语言基本题目。

请大神用 用户定义函数 还有switch case if else if函数 。最基本的东西。

用户输入 年份 和 那一年的多少天。 求输出 那一天是几月几号星期几 和它的上一周 是几月几号星期几。
求出它的上一个周日 是几月几日。

例如:
请输入 年份:2014
请输入 天数: 47

输入年份为:2014年2月18日 星期一。
上一个周日为 : 2014年2月16日。

#include <stdio.h>

void CaculateWeekDay(int y,int m, int d)
{
    if(m==1||m==2) {
        m+=12;
        y--;
    }
    int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
    switch(iWeek)
    {
    case 0: printf("星期一\n"); break;
    case 1: printf("星期二\n"); break;
    case 2: printf("星期三\n"); break;
    case 3: printf("星期四\n"); break;
    case 4: printf("星期五\n"); break;
    case 5: printf("星期六\n"); break;
    case 6: printf("星期日\n"); break;
    }
}
void main()
{
    int year=0,month=0,day=0;
    printf("请输入日期:格式为:1900,1,1\n");
    char temp = '1';
    while (temp != '0')
    {
        scanf("%d,%d,%d",&year,&month,&day);
        scanf("%c",&temp);
        CaculateWeekDay(year,month,day);

        printf("输入0退出,其他继续:");
        scanf("%c",&temp);
    }
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-03-07
# include <stdio.h> 
#include  <stdlib.h>
/***************************
函数名称: int yue(int Yuefen,int Nian)
函数功能:计算某年某月的天数。
函数参数:Yuefen:某月,Nian: 某年。
函数返回:int型天数。大于28,小于31值。
***************************/
int yue(int Yuefen,int Nian)  
 {
  switch((Yuefen)%13)
  {
   case 2:
     if((Nian%4==0)&&(Nian%100!=0)||(Nian%400==0))
         return 29;                             // 特殊的二月
     return 28;
   case 1:case 3 :case 5 : case 7 :
   case 8:case 10:case 12:          return 31;  // 31 天的月份
   case 4:case 6 :case 9 : case 11: return 30;  // 30 天的月份
   default: return 0;
   } 
 }
/***************************
函数名称: int nian(int Nian)
函数功能:计算某年天数。
函数参数:Nian: 某年。
调用函数:int yue(int Yuefen,int Nian)  
函数返回:int型天数。365或366这两个值。
***************************/
int nian(int Nian)
 {
  int i;
  int Tian=0;
  for(i=1;i<13;i++)      // 一年12个月,
      Tian+=yue(i,Nian); // 12月求和
  return Tian;
  //通样只用2月份判断也可以实现。
  /*
  if(yue(2,Nian)==28)
     return 365;
  else
     return 366;
  */
 }
/***************************
函数名称: int Cnian(int Nian,int n)
函数功能:计算某年后多少年后的天数
函数参数:Nian: 某年。n:年数
调用函数:int nian(int Nian)
函数返回:int型天数。 
***************************/
int Cnian(int Nian,int n)    
{
 int i;
 int x=0;
 for(i=0;i<n;i++)
     x+=nian(Nian+i);
 return x;
}
/***************************
函数名称: Wnian(int Nian,int Yue,int Ri)
函数功能:计算出生这年过了多少天。
函数参数:Nian: 出生年份。Yue:出生月份,Ri:出生日期
调用函数:yue(i,Nian);
函数返回:int型天数。 
***************************/
int Wnian(int Nian,int Yue,int Ri)  
 {
  int i;
  int ye = 0;
  for(i=1;i<Yue;i++)
    ye+=yue(i,Nian);    // 以前月份天数求和
  return  ye+Ri;
 }
/***************************
函数名称: Rnian(int Nian,int Yue,int Ri)
函数功能:计算出生这年还有几天过年
函数参数:Nian: 出生年份。Yue:出生月份,Ri:出生日期
调用函数:nian(),Wnian()
函数返回:int型天数。 
***************************/
int Rnian(int Nian,int Yue,int Ri)        
 { 
  return nian(Nian)-Wnian(Nian,Yue,Ri);   // 出生年的天数-出生前的天数。
 }
/***************************
函数名称: ri(int Tian,int Nian)
函数功能:知道小于一年的天数计算日期。
函数参数:Nian: 年份。Tian:天数?
调用函数:无
函数返回:int型天数。 
***************************/
int ri(int Tian,int Nian)   
{
 int x = Tian;
 switch((Tian/31)%12)
  {                 
   case 11: x -= 30;
   case 10: x -= 31;
   case 9 : x -= 30;
   case 8 : x -= 31;
   case 7 : x -= 31;
   case 6 : x -= 30;
   case 5 : x -= 31;
   case 4 : x -= 30;
   case 3 : x -= 31;
   case 2 :{x -= 28;if((Nian%4==0)&&(Nian%100!=0)||(Nian%400==0))x--;}
   case 1 : x -= 31;
   default: x;
   }
   return x;
 }
//主程序
//功能:知道出生日期求10000天后的日期。
main ()
{
 int yy,mm,dd; 
 int tt,ttt;
 int i,j,n,k,l,Shengyu,ZhengnianT,ZhengyueT;
 long kk;
 int y=0,m=0,d=0;      //计算求得结果。
 yy=2014,mm=1,dd=0;tt= 1;        // 文件读取失败设置默认参数。
 scanf("%d,%d",&yy,&tt);
 ttt=tt;
 if(tt==0)tt=1;   
 if(tt>366)tt=1; //当大于 1年 强制为1,要求输入天数1-365天之间的计算。
 //printf("\n%d %d %d\n",yy,mm,dd);         // 显示读取的数据。
 ////////////////////////////////
 y = tt / 366 + yy;                      // 根据天数大致推算出要求年数
 Shengyu = Rnian(yy,mm,dd);              // 计算出生那年剩余的天数。
 if(tt>Shengyu)                          // 判断是否是出生那年。
 {
   Shengyu = tt-Shengyu;                 // 计算出出去出生那年还剩余的天数。
   ZhengnianT = Cnian(yy+1,Shengyu/366); // 计算出出生后完整年的天数。
   Shengyu-= ZhengnianT;                 // 计算出最后一年剩余的天数。
   m = Shengyu/31+1;                     // 计算出组后几天的月份。
   d = ri(Shengyu,y);                    // 计算出组后几天的日期。
   printf("%d-%02d-%02d\n",y,m,d );      // 屏幕格式化显示 
   getch();                              // 调试
 }
 else                                    // 计算时间小于出生年到过年的时间。
  {
   Shengyu = yue(mm,yy)-dd;              // 这个月剩余的天数。
   if(Shengyu>tt)                        // 没有超出出生的月份。
   {
    printf("%d-%d-%d\n",y,mm,d=dd+tt); 
   // fclose(out);
    }
   else
    {
     Shengyu=(tt-Shengyu);                // 超出出生月剩余天
     k = Shengyu / 31 + 1;                // 超出的多少月。
     m = mm + k;                          // 计算出月份。
     ZhengyueT=0;
     for(i=mm+1;i<k;i++)
      ZhengyueT+=yue(i,yy);               // 计算出整月的天数。
     d = Shengyu-ZhengyueT;               // 计算出日期。
     printf("%d-%d-%d\n",y,m,d ); 
    }
  }
 //////////////////////////////////////////
 // 推算星期几
  if(yy>=2007)
   {
     i= yy - 2007;
     kk=0;
     for(j=0;j<i;j++)
      kk+=nian(2007+j); 
     printf("\n%d - ",yy);
     printf("%d \n",kk=(kk%7)+1);
   }
  else
    {
     i= 2007 - yy;
     kk=0;
     for(j=0;j<i;j++)
      kk+=nian(yy+j);
      printf("\n%d - ",yy); 
     if(kk%7==0) printf("%d\n",kk=1);
     else        printf("%d\n",kk=(8-(kk%7)));
    } 
     //for(tt=21;tt<45;tt++)
    {
       //if(tt%7==1)printf("\n %d \n",kk);
       //else
        if(tt%7+kk>8)
          printf("%d \n",tt = tt%7+kk-8);
        else
          printf("%d \n",tt = (tt%7+kk-1)==8?1:(tt%7+kk-1));
    }
  //上周日的日期:
  if(ttt>7)
/////////////////////////推算上周日的日期
  {
  tt = ttt-tt;
  y = tt / 366 + yy;                      // 根据天数大致推算出要求年数
 Shengyu = Rnian(yy,mm,dd);              // 计算出生那年剩余的天数。
 if(tt>Shengyu)                          // 判断是否是出生那年。
 {
   Shengyu = tt-Shengyu;                 // 计算出出去出生那年还剩余的天数。
   ZhengnianT = Cnian(yy+1,Shengyu/366); // 计算出出生后完整年的天数。
   Shengyu-= ZhengnianT;                 // 计算出最后一年剩余的天数。
   m = Shengyu/31+1;                     // 计算出组后几天的月份。
   d = ri(Shengyu,y);                    // 计算出组后几天的日期。
   printf("%d-%02d-%02d\n",y,m,d );      // 屏幕格式化显示 
   getch();                              // 调试
 }
 else                                    // 计算时间小于出生年到过年的时间。
  {
   Shengyu = yue(mm,yy)-dd;              // 这个月剩余的天数。
   if(Shengyu>tt)                        // 没有超出出生的月份。
   {
    printf("%d-%d-%d\n",y,mm,d=dd+tt); 
   // fclose(out);
    }
   else
    {
     Shengyu=(tt-Shengyu);                // 超出出生月剩余天
     k = Shengyu / 31 + 1;                // 超出的多少月。
     m = mm + k;                          // 计算出月份。
     ZhengyueT=0;
     for(i=mm+1;i<k;i++)
      ZhengyueT+=yue(i,yy);               // 计算出整月的天数。
     d = Shengyu-ZhengyueT;               // 计算出日期。
     printf("%d-%d-%d\n",y,m,d ); 
    }
  }
  }
///////////////////////////////////////////////////////////////////////
else
 {
   if(kk!=7&&ttt!=1)
  {
  yy-=1  ;   
  dd=31-kk+1;
  printf("%d-%d-%d\n",yy,12,dd );
  }
  else
   printf("%d-%d-%d\n",yy,1,1 );
 }
  getch();
}

以前编写的求生日以后的天数,是几号,改一下就可以使用了。

例如:

输入:2014,47

输出:2014-2-16  // 推算出的日期

            2014-3        // 推算出的当年1月1日的星期几

            7                  //  求的星期几,

            2014-2-9    //   上周日的时间

用户输入2014 年份 和 那一年的47天。 求输出 那一天是2月16号星期7 和它的上周7 是2月9号

特殊的:

输入:2014,2

输出:2014-1-2

            2014-3

            4

            2013-12-29

输入:2017,2

输出:2017-1-2

            2014-7

            1

            2014-1-1

。。。。。。。。。。。。。。。。。。。。。。。

还有待测试,

这是我在以前编写计算出生后多少天后是几号修改的。直接调用里面的计算函数,

思路明确就简单了。主要是一些日期接缝的计算比较麻烦,需要仔细看会出现几种情况。 

本回答被提问者采纳
第2个回答  2014-02-18

看了下,前面的问题都不大,关键是输出上个周日的日期,虽然很简单,但是写起来很是繁琐,要考虑到是1月几号的上个周日可能是上一年的情况,还要考虑到每月前几号的上个周日可能是上个月的情况,总之除了最后一句,代码如下:

#include<stdio.h>
void date(int year,int day)
{
int i,m=1,weekday,month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
for(i=0;day>=28;i++){day-=month[i];m++;}
if((year%4==0 && year%100!=0 || year%400==0) && m>2) day-=1;
printf("输入年份为:%d年%d月%d日 ",year,m,day);
if(m==1||m==2) {m+=12;year-=1;}
weekday = (day+1+2*m+3*(m+1)/5+year+(year/4)-year/100+year/400) % 7;
if(7==weekday) printf("星期日。\n");
else printf("星期%d。\n",weekday);
}
int main(void)
{
int year,day;
printf("请输入年份: ");
scanf("%d",&year);
printf("请输入天数: ");
scanf("%d",&day);
date(year,day);
return 0;
}

第3个回答  2014-02-18
稍微试了一下,朕发现卿家这个程序量有点大!
第4个回答  2014-02-18

#include <stdio.h>
#include <string.h>
int getDayOfYear(int year, int day);
int getWenOfYear(int sumDay);
char* getMonOfYear(int year, int day);
int main()
{
    int year, day;
    scanf("%d%d", &year, &day);
    int sumDay = getDayOfYear(year,day);
    int wekend = getWenOfYear(sumDay);
    char *pMonth = getMonOfYear(year,day);

    printf("%d年 %s 星期%d\n ", year, pMonth, wekend);
    delete pMonth;
    return 0;
}

int getDayOfYear(int year, int day)
{
    //year ==1970
    if (1970 == year)
    {
        return day;
    }
    //计算到year这年的天数
    int sumDay = day ;
    for(int i=1970;i<year;i++)
    {
        //是否闰年
        int flag =(i%4==0 && i%100!=0) || i%400 == 0 ? 1 : 0;
        if (flag==1)
        {
            sumDay += 366;//闰年
        }else
        {
            sumDay += 365;//平年
        }
        
    }
    return sumDay;//1970年1月1日到现在的天数
}

int getWenOfYear(int sumDay)
{
    //1970年 1月 1 日是星期四
    int temp = sumDay%7;
    //printf(" %d, %d", sumDay, temp);
    int wek = 0;
    switch(temp)
    {
    case 0:
        wek = 3;
        break;
    case 1:
        wek = 4;
        break;
    case 2:
        wek = 5;
        break;
    case 3:    
        wek = 6;
        break;
    case 4:
        wek = 7;
        break;
    case 5:
        wek = 1;
        break;
    case 6:
        wek = 2;
        break;
    }
    return wek;
}
char* getMonOfYear(int year, int day)
{
    int days[2][13]  =  {
        // 0    1    2    3    4    5    6    7    8    9    10    11    12
        {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, //平年  365
        {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}  //闰年  366
    };
    int flag =(year%4==0 && year%100!=0) || year%400 == 0 ? 1 : 0;
    int iMon = 1;
    int iDay = day;
    char *cMonth = new char[100];
    memset(cMonth, 100,'\0');
    for ( iMon = 1;iMon<13; iMon++)
    {
        sprintf(cMonth, "%d月%d日", iMon, iDay);
        if ((iDay = iDay-days[flag][iMon])<0)
            break;
    }
    return cMonth;
}


求加分 

相似回答