分类：电脑/网络-程序设计
问题：用c语言写万年历应该怎样写？小弟编写了一个，但总是报错，麻烦哪位 
小弟编写了一个，但总是报错，麻烦哪位高人指点一下，告诉我错在哪里？应该怎么改？事成之后必有重谢。 我输入年月日时，总是给出日期错误的提示。#include <std.h>int isLeap(){  int year,isleap;  if(((year%4==0)&&!(year%100==0))||(year%400==0))        isleap=1;  else    isleap=0;  return isleap;}int lastdayofmonth(){  i小弟编写了一个，但总是报错，麻烦哪位高人指点一下，告诉我错在哪里？应该怎么改？事成之后必有重谢。 我输入年月日时，总是给出日期错误的提示。#include <std.h>int isLeap(){  int year,isleap;  if(((year%4==0)&&!(year%100==0))||(year%400==0))        isleap=1;  else    isleap=0;  return isleap;}int lastdayofmonth(){  int lastday,month,isleap;  switch (month)  {  case 1:   case 3:   case 5:   case 7:  case 8:   case 10:   case 12: lastday=31;  case 4:   case 6:   case 9:   case 11: lastday=30;  case 2:     {      if (isleap==1) lastday=29;            else lastday=28;    }}  return lastday;}int ValidDate(){  int year,month,day,valid;  int yearOK,monthOK,dayOK;  if ((year>1811)&&(year<=2012)) yearOK=1;      else yearOK=0;  if ((month>0)&&(month<=12)) monthOK=1;      else monthOK=0;  if ((day>0)&&(day<=lastdayofmonth())) dayOK=1;      else dayOK=0;  if(yearOK && monthOK && dayOK) valid=1;      else valid=0;  return valid;}int getday(){  int year,month,day;  printf("Enter a month/a day/a year\n");  scanf("%d %d %d",&month,&day,&year);  return ValidDate();}void incrementdate(){ int day,year,month; if (day<lastdayofmonth()) day+=1;   else    {     day=1;    if (month==12)    {      month=1;      year+=1;    }        else month+=1;}}void print(){ int day,year,month; if (ValidDate())        printf("nextday is %d/%d/%d\n",month,day,year);  else    printf("Date error\n");}void main(){ getday(); isLeap(); ValidDate(); incrementdate(); print();} 
回答：主要是因为你都是在里面定义的变量，它们的有效范围仅限在它们所在的函数里。虽然几个不同函数里的变量名都一样，但它们之间不能传递值。不妨把day,year,month定义在大家都能访问到的地方，让各函数共用同样的变量。另外，1、switch－case里少了“break;”。2、main里的isLeap();ValidDate();实际上是在其他函数里调用才有意义的，这里没什么用，可以去掉。3、lastdayofmonth里需要加这句isleap=isLeap();我觉得你在函数的参数的用法、变量的作用域这些方面比较薄弱。多研究研究这些方面的知识应该对你有帮助。#include <stdio.h>int day,year,month;int isLeap(){  int isleap;  if(((year%4==0)&&!(year%100==0))||(year%400==0))    isleap=1;  else    isleap=0;  return isleap;}int lastdayofmonth(){int lastday,isleap;switch (month){case 1: case 3: case 5: case 7:case 8: case 10: case 12: lastday=31;break;case 4: case 6: case 9: case 11: lastday=30;break;case 2: {  isleap=isLeap();  if (isleap==1) lastday=29;  else lastday=28;}}return lastday;}int ValidDate(){  int valid;  int yearOK,monthOK,dayOK;  if ((year>1811)&&(year<=2012)) yearOK=1;  else yearOK=0;  if ((month>0)&&(month<=12)) monthOK=1;  else monthOK=0;  if ((day>0)&&(day<=lastdayofmonth())) dayOK=1;  else dayOK=0;  if(yearOK && monthOK && dayOK) valid=1;  else valid=0;   return valid;}int getday(){  printf("Enter a month/a day/a year\n");  scanf("%d %d %d",&month,&day,&year);  return ValidDate();}void incrementdate(){  if (day<lastdayofmonth()) day+=1;  else   {    day=1;    if (month==12)    {      month=1;      year+=1;    }    else month+=1;  }}void print(){  if (ValidDate())    printf("nextday is %d/%d/%d\n",month,day,year);  else    printf("Date error\n");}void main(){  getday();  incrementdate();  print();}＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝补充一下，又发现一个问题。输入之后虽然你做了输入检查，但是现在的写法，这个检查起不到任何作用。可以把main里的getday();改写成  if(getday()==0)  {    printf("Date error\n");    return;  }意思是如果输入的日期不正常的话打出出错信息并结束程序。