用C语言函数编写求年月日的程序。我想知道我这个程序哪里错了,语法没有错,但是答案不对。

#include <stdio.h>
#include <math.h>
int year(int year);
int month(int month,int year);
void main()
{
int y,m,d,sum,i;
printf("请输入年月日\n");
scanf("%d%d%d",&y,&m,&d);
y=year(y);
sum=0;
for(i=1;i<m;i++)
{m=month(m,y);
sum=sum+m;}
sum=sum+d;
printf("是第%d天",sum);
}

int year(int year)
{
if( (year%4==0 && year%100!=0) || (year%400==0) )
return (366);
else return (365);
}
int month(int month,int year)
{
switch(month)
{ case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: return (31);break;
case 2:
{if (year==366) return(29);
else return(28);break;}
default: return(30);break;}
}

你的这段代码有问题,for(i=1;i<m;i++)
{m=month(m,y);
sum=sum+m;}你这样写,就是将月份重复的加了,如果是三月份,你将会发现你加了好多次,自然就会出现800多天了,下面我将代码改进,答案也是对的。

#include <stdio.h>
#include <math.h>
int year(int year);
int month(int month,int year);
void main()
{
 int y,m,d,sum,i,n;
 printf("请输入年月日\n");
 scanf("%d%d%d",&y,&m,&d);
 y=year(y);
 sum=0;
 n=0;//定义一个n,用于每个月份天数相加
 for(i=1;i<m;i++)
 {
  n=month(m,y);//将你的m替换为n,结果就对了
  sum=sum+n;
 }
 sum=sum+d;
 printf("是第%d天",sum);
}
int year(int year)
{
 if( (year%4==0 && year%100!=0) || (year%400==0) ) 
   return (366);  
   else return (365);
}
int month(int month,int year)
{
  switch(month)
   {
    case 1:   
    case 3:
    case 5: 
    case 7:
    case 8:
    case 10:
    case 12:
     return (31);
         break;
     case 2:
          {
           if (year==366)
            return(29);
             else return(28);
             break;
          }
          default: return(30);
          break;
          }
   }

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-04
你那个算法不对,说一个问题
int year(int year) 输入一个年份,返回一个360多给y,而y又是定义为年份

下面我这个供你采纳:

#include<stdio.h> int judge(int year,int month) //定义judge函数 { if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //天数为31天的月份 return(1); else if(month==2) { if(year%4!=0||year%100==0&&year%400!=0) //判断闰年真为平年 return(2); else return(3); } else return(4); } int main() { int year,i,j,a,n,m,k; //定义变量 char ** p; //指向指针的指针变量 char * week[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; char*month[]={"January","February","March","April","May","June","July","August","September","October","November","December"}; printf("please inter the year:"); //输入所求年份 scanf("%d",&year); printf("\n"); printf("the calendar of the year%d.",year); printf("\n"); a=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7; //判断每年的第一天是周几 当a值为0的时候对应周日 for(i=0;i<12;i++) //月份循环 { n=judge(year,i+1); // 调用函数n值为1234代表每月为多少天 p=month+i; //数组名为首地址加i 循环 printf("%s\n",*p); //输出月份名 printf("\n"); for(j=0;j<7;j++) //星期循环 { p=week+j; //数组名为首地址加j 循环
printf("%6s",*p); //.六列字符串输出 } printf("\n"); for(k=0;k<a;k++) // a代表每年第一天后为每月前空格天数 printf(" "); //输出六个空格 for(m=1;m<32;m++) //每月天数循环 { printf("%6d",m); //输出格式占六列右端对齐 if((a+m)%7==0) printf("\n"); //满星期换行 if(n==1&&m==31) break; //从此处至以下执行整月停止 else if(n==2&&m==28) break; else if(n==3&&m==29) break; else if(n==4&&m==30) break; } a=(a+m)%7; // a为每月末行天数 printf("\n"); printf("============================================"); printf("\n"); } }
第2个回答  2013-05-04
for(i=1;i<m;++i)
{
    sum+=month(i,y);
}

如上。这个for循环中i值和m值都不能改变,且你传给month函数的参数不对。

第3个回答  2013-05-04
for循环,m被重新赋值了,你重新定义一个变量替换m。这些文体一般都可以用调试看出来的。或者学点汇编更好。追问

我们是才开始学C,请问汇编是指什么?

追答

你们?我也才学,加练习方式吧154015579!我刚刚回来用电脑看了一下,改为如下:

#include <stdio.h>
#include <math.h>
int year(int year);
int month(int year,int month);
void main()
{
    int y,m,d,sum,i,j;
    printf("请输入年月日\n");
    scanf("%d%d%d",&y,&m,&d);
    y=year(y);
    sum=0;
    for(i=1;i<m;i++)
    {
        j=month(y,i);
        sum=sum+j;
    }
    sum=sum+d;
    printf("是第%d天",sum);
}
int year(int year)
{
    if( (year%4==0 && year%100!=0) || (year%400==0) )
        return (366);
    else return (365);
}
int month(int year,int month)
{
    switch(month)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12: return (31);
        break;
    case 2:
        {
            if (year==366)
                return(29);
            else
                return(28);
            break;
        }
    default: return(30);break;
    }
}

因为c语言是用的stdcall,所以计算方式是从右向左的,你定义的int month,会先执行year的判断,所以把year定义在左边,结果ok!


至于汇编,计算机语言有 机器语言,汇编语言,c、c++等汇编是处于机器语言和c++中间的,一般要学好c++,汇编是必须会的。百度都有这些的介绍,我就不复制了。

本回答被提问者采纳
第4个回答  2013-05-04
把那个m=month(m,y);改成m=month(i,y);就行了。追问

答案还是不对。我输入2013 2 1,显示的是800多天,这明显不对呀

相似回答