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

baidu_41597718 2018-01-12 12:46:27
#include<stdio.h>#include<windows.h>#define N 100void 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("删除成功!");}
...全文
728 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_41597718 2018-01-12
  • 打赏
  • 举报
回复
tmonth ,tyear ,tday 这三个变量不是void add ()这个函数里的输入值吗?应该可以和year,yue,k这三个变量比较啊。另外,如果这种说法不对的话该怎么修改啊?
自信男孩 2018-01-12
  • 打赏
  • 举报
回复
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比较怎么相等? 还有整个函数的三个参数没有定义类型呢? 代码写多了不易调试,那么为什么不在没写完一个功能后就调试一下呢,这样没写完一个保证一个没问题,步步为营,一步一个脚印完成整个程序功能。 一下子写这么多再调试,怎么发现问题出在哪儿。
baidu_41597718 2018-01-12
  • 打赏
  • 举报
回复
#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("删除成功!");
}
复制粘贴的时候出了点问题,还是希望大佬们能帮忙看看,谢谢啦!
自信男孩 2018-01-12
  • 打赏
  • 举报
回复
看到这样的代码风格,看代码的人会不会疯~~~
自信男孩 2018-01-12
  • 打赏
  • 举报
回复
引用 4 楼 baidu_41597718 的回复:
tmonth ,tyear ,tday 这三个变量不是void add ()这个函数里的输入值吗?应该可以和year,yue,k这三个变量比较啊。另外,如果这种说法不对的话该怎么修改啊?
但是你别再checkrw函数里定义相同名字的变量呀,这样checkrw函数里不会使用你的全局变量tyear, tmonth, tday而是使用局部变量的。这叫当局部变量和全局变量同名是,局部变量屏蔽全局变量。
super_admi 2018-01-12
  • 打赏
  • 举报
回复
居然还有人认真看了这么长的代码,佩服佩服佩服。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧