user-0 提问: 这个程序有什么问题啊，调用checkrw函数时为什么不能在输出月日历的时候提示任务

回复:
user: user-0
content: tmonth ,tyear ,tday 这三个变量不是void add ()这个函数里的输入值吗？应该可以和year,yue,k这三个变量比较啊。另外，如果这种说法不对的话该怎么修改啊？

user: user-1
content: void checkrw(year,yue,k)//检查是否有任务提醒 {     int i,tmonth,tday,tyear;     load();     for(i=0;i<lenr;i++)     {         if(tyear == year && tmonth==yue && tday==k)         {             printf("任务提醒：");             puts(rw[i].things);//显示提醒             Beep(500,500);         }     } } 仔细看一下你的这个函数，tmonth,tday,tyear这三个是局部变量，没有初始化，是随机值，下面和year, yue, k比较怎么相等？ 还有整个函数的三个参数没有定义类型呢？  代码写多了不易调试，那么为什么不在没写完一个功能后就调试一下呢，这样没写完一个保证一个没问题，步步为营，一步一个脚印完成整个程序功能。 一下子写这么多再调试，怎么发现问题出在哪儿。

user: user-0
content: #include<stdio.h> #include<windows.h> #define N 100  void festival(int yue,int k); void  delete(); void save(); int memorandum(); void add(); void load(); void checkrw(); int menue(); void operatemenue(); void operatememorandum(); int assessyear(int year); void howmanydays(int year,int *m); int yeardays(int year ); int monthdays(int year,int yue,int *m); void printyear(int year,int *m,int n); void printmonth(int year,int *m,int yue); void printrunnian(int year);     struct remind   {       char things[100];   }rw[N];    int lenr;  void main() {    	load();     operatemenue(); }  int menue()                       /*菜单函数*/ {    int chose;    printf("\t\t\t\t\n\n\n");    printf("\t\t\t\t   欢迎来到万年历系统\n\n\n");    printf("\t\t\t\t****************************\n");      printf(" \t\t\t\t       1.查看月日历         \n\n");    printf(" \t\t\t\t       2.查看年日历          \n\n");    printf(" \t\t\t\t       3.备忘录系统             \n\n") ;    printf(" \t\t\t\t       4.退出系统               \n\n");    printf("\t\t\t\t****************************\n\n");     printf("请选择\n");    do{                                             /*用do  while实现输错后重新输入*/        scanf("%d",&chose); 	   if(chose!=1&&chose!=2&&chose!=3) 	   printf("你输入错误请重新输入\n"); 	   }        while(chose!=1&&chose!=2&&chose!=3); 	   return chose; }  void operatemenue()                    /*菜单处理函数*/ {   int n=0,month,year,yue,day,k;     n=menue();   switch(n)   { 		    case 1:printf("查看月日历\n"); 			       printf("请输入你想查看的年份、月份和日期:\n");                    scanf("%d%d%d",&year,&yue,&k);   				   howmanydays(year,month); 				   festival( yue, k); checkrw(year,yue,k); 				   printmonth(year,month,yue);  				   break;             case 2:printf("查看年日历\n"); 			       printf("请输入你想查看的年份、月份和日期\n");                    scanf("%d%d%d",&year,&yue,&k);                    printf("年份:%d\n",year); 			       howmanydays(year,month); 			       festival( yue, k); 				   printyear(year,month,12); 				   break;  			case 3:	    operatememorandum(); checkrw(yue,k);break;              case 4:printf("退出系统\n"); 			        exit(0); 					break;            }   }  int assessyear(int year)                     /*判断润年或非润年的函数*/ {    int leap;     if((year%4==0&&year%100!=0)||(year%400==0))   leap=1;    else    leap=0; return leap; }  void howmanydays(int year,int *m)             /*每月多少天函数*/ {    int i,n;    i=assessyear(year);    for(n=1;n<=7;n=n+2) 	*(m+n)=31;     *(m+8)=31;*(m+10)=31;*(m+12)=31; 	*(m+4)=30;*(m+6)=30;*(m+9)=30;*(m+11)=30;     *m=0; 	if(i==1)  *(m+2)=29; 	else      *(m+2)=28; }  int yeardays(int year)                  /*从公元1900年到你输入的上一年共有多少天*/ {     int y,j,day=0; 	for(y=1;y<year;y++) 	{ 	   j=assessyear(year); 	   if(j==1) 	     day+=366;        else 	     day+=365;      } 	 return day; }  int monthdays(int year,int month,int *m)                /*从公元1900年到你输入的上一月共有多少天*/ {    int i,day=0;    day=yeardays(year);    for(i=1;i<month;i++) 	    day+=(*(m+i)); 	return day; }  void printmonth(int year,int *m,int yue)	        /*输出月日历*/ {    int leap,k=1,day,x;    printf("\t\t%d年%d月\n",year,yue);    printf("星期日  星期一  星期二  星期三  星期四  星期五  星期六\n");    day=monthdays(year,yue,m);  	     day-=1;                    /*输入的月份的上一个月到公元1900年一月一日相差的天数*/    while(k<=*(m+yue))    {       leap=(day+k)%7;               /*寻找一号对应星期几*/ 	  for(x=0;x<leap;x++) 	  printf("       ");       for(x=leap;x<=6;x++,k++) 	     if(k>*(m+yue))                        /*当k超过本月的最大天数也就意味着它不能在和星期几对应了*/ 		     continue; 		 else  printf("    %-4d",k);      printf("\n\n");  	 }  }  void printyear(int year,int *m,int n)    /*一年的日历*/ {     int day,i,k=1,leap,x; 	day=yeardays(year); 	day=day-1;                        /*从公元1900年到你输入的年份的上一年相差几天*/ 	printf("年份:%d的日历\n",year); 	for(i=1;i<=n;i++) 	{ 	   printf("\t\t%d月\n",i); 	   printf("星期日 星期一 星期二 星期三 星期四 星期五 星期六\n"); 	   k=1;                                           /*k重新赋值为一有利于找到下个月1号的位置*/ 	   while(k<=*(m+i))                            /*一个月的日历*/ 	   { 	     leap=(day+k)%7; 		 for(x=0;x<leap;x++) 		 printf("       ");          for(x=leap;x<=6;x++,k++) 		   if(k>*(m+i))                 /*当k超过本月的最大天数也就意味着它不能在和星期几对应了*/ 		       continue; 		   else 		       printf("   %-4d",k);         printf("\n"); 		}       day=day+*(m+i); 	  printf("\n"); 	  }  }  void festival(int yue,int k)        /*判断是否公历节日*/ {      if(yue==1)    		switch(k) 	{           case 1:               printf("这天是元旦\n\n"); Beep(500,500);    	}      if(yue==2)       	switch(k) 	{         case 14:         printf("这天是情人节\n\n");Beep(500,500); 	}      if(yue==3)        switch(k) 	{      case 8:         printf("这天是妇女节\n\n");  Beep(500,500);         break;      case 12:         printf("这天是植树节\n\n");Beep(500,500); 	}       if(yue==4)        switch(k) 	{       case 1:         printf("这天是愚人节\n\n");Beep(500,500); 	}      if(yue==5)             switch(k) 	{       case 1:printf("这天是劳动节\n\n"); Beep(500,500);               break;       case 4:printf("这天是青年节\n\n");Beep(500,500); 	}      if(yue==6)      	switch(k) 	{       case 1:         printf("这天是儿童节\n\n"); Beep(5,500); 	}      if(yue==7)               switch(k) 	{        case 1:         printf("这天是建党节\n\n");Beep(500,500); 	}      if(yue==8)           	switch(k) 	{        case 1:         printf("这天是建军节\n\n");Beep(500,500); 	}      if(yue==9)                 	switch(k) 	{        case 10:         printf("这天是教师节\n\n");Beep(500,500); 	}      if(yue==10)                      switch(k) 	{        case 1:           printf("这天是国庆节\n\n");Beep(500,500); 	}  }   int memorandum() {  int chose;    printf("\t\t\t\t\t 备忘录系统\n\n\n");    printf("\t\t\t\t***************************\n\n");     printf("\t\t\t\t\t1.添加备忘录\n\n");    printf("\t\t\t\t\t2.删除备忘录\n\n");    printf("\t\t\t\t\t3.退出系统\n\n");    printf("\t\t\t\t***************************\n\n\n");    printf("请选择\n");     do{                                             /*用do  while实现输错后重新输入*/        scanf("%d",&chose); 	   if(chose!=1&&chose!=2&&chose!=3) 	   printf("你输入错误请重新输入\n"); 	 } 	while(chose!=1&&chose!=2&&chose!=3);    return chose; }  void operatememorandum() {  	int n;n=memorandum();      switch(n)     {       case 1:add();break;       case 2:delete();break;       case 3:exit(0); break;     } }   void  save()                    //保存信息 { FILE *fp; if((fp=fopen("renwu.text","wb"))==NULL) {    printf("文件打开失败！");    exit(0); }  fwrite(&rw,sizeof(struct remind),N,fp);//写入文件 fclose(fp); }    void load() {  FILE *fp;int i;     if((fp=fopen("renwu.text","rb"))==NULL)        fopen("renwu.text","wb");    else    {        fread(&rw,sizeof(struct remind),N,fp);//读取文件        for(i=0,lenr=0;i<N;i++)            {               if(strlen(rw[i].things)!=0)                  lenr++;            }//计算日程条数         fclose(fp);    } }    void checkrw(year,yue,k)//检查是否有任务提醒 { 	  int i,tmonth,tday,tyear;load();       for(i=0;i<lenr;i++) 	  {           if(tyear==year&&tmonth==yue&&tday==k) 		  {               printf("任务提醒：");               puts(rw[i].things);//显示提醒               Beep(500,500); 		  } 	  } }  void add()     //增加任务提醒 {   	int i,tmonth,tday,tyear;     i=lenr;     printf("请输入提醒年月日：");     scanf("%d%d%d",&tyear,&tmonth,&tday);      printf("请输入提醒内容：");     	scanf("%s",&rw[i].things);     	lenr++;//提醒数加1     save();     printf("添加成功!"); }  void delete() //删除提醒 {     int i,j;     printf("_______________________________________________________________________\n");     printf("编号 提醒内容\n"); load();     for(i=0;i<lenr;i++)     printf("%-3d %s\n",i,rw[i].things );      printf("_______________________________________________________________________\n");     printf("请输入要删除的编号：");    scanf("%d",&i);     while(i<0 || i>=lenr)     { 		printf("输入错误请重新输入：");        		scanf("%d",&i);     	}         rw[i].things[0]='\0'; /*删除*/          lenr--;//任务个数减一         for(j=i;j<lenr;j++)            rw[j]=rw[j+1];            save();         printf("___________________________________________________\n");         printf("编号  提醒内容\n");         for(i=0;i<lenr;i++)             printf("%-3d %s\n",i,rw[i].things );         printf("______________________________________________________\n");      printf("删除成功！"); } 复制粘贴的时候出了点问题，还是希望大佬们能帮忙看看，谢谢啦！

user: user-1
content: 看到这样的代码风格，看代码的人会不会疯～～～

user: user-1
content: 引用 4 楼 baidu_41597718 的回复:tmonth ,tyear ,tday 这三个变量不是void add ()这个函数里的输入值吗？应该可以和year,yue,k这三个变量比较啊。另外，如果这种说法不对的话该怎么修改啊？ 但是你别再checkrw函数里定义相同名字的变量呀，这样checkrw函数里不会使用你的全局变量tyear, tmonth, tday而是使用局部变量的。这叫当局部变量和全局变量同名是，局部变量屏蔽全局变量。

user: user-2
content: 居然还有人认真看了这么长的代码，佩服佩服佩服。