主要问题是:1、插入新的事件时,原有事件的优先级变化出错,例如,在原有优先级分别为1、2的事件中,插入另一个优先级为2的事件,前者应变为1,3,而程序结果为3,3
2、关闭运行程序的窗口,再打开,无法读取之前的数据
程序如下:
代码贴出来才好修改啊
#include
#include
#include
#define N 100
struct date
{
int year;
int month;
int day;
};
struct event //event:事件信息结构
{
char describe[50]; //describe:事件简要说明
struct date eventdate; //eventdate:事件处理日期
int level; //level:事件优先级,表示事件处理的顺序
int flag; //flag:事件处理状态
}
stud[N];
int nSize;
int mode; //mode:执行的命令
int i;
int Exist;
int t;
void printshijian() //显示事件
{
if(nSize==0) //判断记录是否为空
{
printf("事件列表为空!\n");
return;
}
for( i=0;i<nSize;i++) //循环输出所有记录
{
printf("\n************************\n");
printf("事件说明:%s\n",stud[i].describe);
printf("事件处理日期:%d年%d月%d日\n",stud[i].eventdate.year,stud[i].eventdate.month,stud[i].eventdate.day);
printf("事件优先级:%d\n",stud[i].level);
printf("事件状态:");
switch(stud[i].flag)
{
case 0:
printf("待处理");
break;
case 1:
printf("已处理");
break;
case 2:
printf("延缓处理");
break;
}
}
}
void searchshijian() //查找事件
{
int i,mode;
int year,month,day;
int flag,level;
printf("请输入查找类型:\n 1时间\n 2是否处理\n 3优先级\n");
scanf("%d",&mode);
switch(mode)
{
default:
printf("输入类型错误!\n");
return;
break;
case 1:
printf("请输入时间:\n");
printf("年:");
scanf("%d",&year);
while (year2020)
{
printf("输入的状态有误,请重新输入状态(2015-2020)\n");
scanf("%d",&year);
}
printf("月:");
scanf("%d",&month);
while (month<1||month>12)
{
printf("输入的状态有误,请重新输入状态(1-12)\n");
scanf("%d",&month);
}
printf("日:");
scanf("%d",&day);
while (day<1||day>31)
{
printf("输入的状态有误,请重新输入状态(1-31)\n");
scanf("%d",&day);
}
break;
case 2:
printf("请输入状态:(0/1/2表示待处理/已处理/延缓处理)\n");
scanf("%d",&flag);
break;
printf("请输入优先级:\n");
scanf("%d",&level);
break;
}
for(i=0;i<nSize;i++) //按时间输出全部记录
{
if((1==mode&&stud[i].eventdate.day==day
&&stud[i].eventdate.month==month
&&stud[i].eventdate.year==year)||2==mode
&&flag==stud[i].flag||3==mode
&&level==stud[i].level)
{
printf("\n************************\n");
printf("事件说明:%s\n",stud[i].describe);
printf("事件处理日期:%d年%d月%d日\n",stud[i].eventdate.year,stud[i].eventdate.month,stud[i].eventdate.day);
printf("事件优先级:%d\n",stud[i].level);
printf("事件状态:");
switch(stud[i].flag)
{
case 0:
printf("待处理");
break;
case 1:
printf("已处理");
break;
case 2:
printf("延缓处理");
break;
}
}
}
}
void newshijian() //插入事件
{
int bExist=0;
int i;
int day,month,year;
int flag,level;
char *des=(char *)malloc(sizeof(char)*20); //给简要说明分配存储空间
printf("请输入时间:\n");
printf("年:");
scanf("%d",&year);
while (year2020)
{
printf("输入的状态有误,请重新输入状态(2015-2020)\n");
scanf("%d",&year);
}
printf("月:");
scanf("%d",&month);
while (month<1||month>12)
{
printf("输入的状态有误,请重新输入状态(1-12)\n");
scanf("%d",&month);
}
printf("日:");
scanf("%d",&day);
while (day<1||day>31)
{
printf("输入的状态有误,请重新输入状态(1-31)\n");
scanf("%d",&day);
}
printf("请输入优先级:\n");
scanf("%d",&level);
for(i=0;i<nSize;i++)
{
if(stud[i].eventdate.day==day
&&stud[i].eventdate.month==month
&&stud[i].eventdate.year==year
&&stud[i].level==level) //判断时间和优先级是否重复
{
bExist=1;
}
if(bExist)
{
printf("该时间和优先级事件已存在!下面所有事件的优先级往后顺移\a\a\a\n");
for(i=0;i<nSize;i++)
{
do
{
if(stud[i].eventdate.day==day
&&stud[i].eventdate.month==month
&&stud[i].eventdate.year==year)
stud[i].level = stud[i].level+1;
}
while(stud[i].eventdate.day==day
&&stud[i].eventdate.month==month
&&stud[i].eventdate.year==year
&&stud[i].level==level);
}
}
}
printf("请输入状态:(0/1/2表示待处理/已处理/延缓处理)\n");
scanf("%d",&flag);
while (flag!=0&&flag!=1&&flag!=2)
{
printf("输入的状态有误,请重新输入状态(0/1/2表示待处理/已处理/延缓处理)\n");
scanf("%d",&flag);
}
getchar();
printf("请输入事件描述:\n");
gets(des);
strcpy(stud[nSize].describe,des);
free(des);
stud[nSize].eventdate.day=day;
stud[nSize].eventdate.month=month;
stud[nSize].eventdate.year=year;
stud[nSize].flag=flag;
stud[nSize].level=level;
nSize++;
printf("插入事件成功!\n");
}
void editshijian() //修改事件
{
int i,pos=-1;
int day,month,year;
int level,flag;
char *des=(char *)malloc(sizeof(char)*30);
printf("请输入时间:\n");
printf("年:");
scanf("%d",&year);
while (year2020)
{
printf("输入的状态有误,请重新输入状态(2015-2020)\n");
scanf("%d",&year);
}
printf("月:");
scanf("%d",&month);
while (month12)
{
printf("输入的状态有误,请重新输入状态(1-12)\n");
scanf("%d",&month);
}
printf("日:");
scanf("%d",&day);
while (day31)
{
printf("输入的状态有误,请重新输入状态(1-31)\n");
scanf("%d",&day);
}
printf("请输入优先级:\n");
scanf("%d",&level);
for(i=0;i<nSize;i++)
{
if(stud[i].eventdate.day==day
&&stud[i].eventdate.month==month
&&stud[i].eventdate.year==year
&&stud[i].level==level)
{
pos=i;
break;
}
}
if(pos==-1)
{
printf("未找到相关事件!\n");
return;
}
printf("请输入需要修改的事件状态:(0/1/2表示待处理/已处理/延缓处理)\n");
scanf("%d",&flag);
while (flag!=0&&flag!=1&&flag!=2)
{
printf("输入的状态有误,请重新输入状态(0/1/2表示待处理/已处理/延缓处理)\n");
scanf("%d",&flag); //修改事件处理状态
}
stud[pos].eventdate.day=day;
stud[pos].eventdate.month=month;
stud[pos].eventdate.year=year;
stud[pos].flag=flag;
stud[pos].level=level;
printf("编辑成功结束!\n");
}
void delshijian() //删除事件
{
int i,pos=-1; //pos:用于查找记录
int day,month,year;
int level;
struct event tmp; //tmp:用于交换记录
printf("请输入时间:\n");
printf("年:");
scanf("%d",&year);
while (year2020)
{
printf("输入的状态有误,请重新输入状态(2015-2020)\n");
scanf("%d",&year);
}
printf("月:");
scanf("%d",&month);
while (month12)
{
printf("输入的状态有误,请重新输入状态(1-12)\n");
scanf("%d",&month);
}
printf("日:");
scanf("%d",&day);
while (day31)
{
printf("输入的状态有误,请重新输入状态(1-31)\n");
scanf("%d",&day);
}
printf("请输入优先级:\n");
scanf("%d",&level);
for(i=0;i<nSize;i++) //判断是否查找到记录
{
if(stud[i].eventdate.day==day
&&stud[i].eventdate.month==month
&&stud[i].eventdate.year==year
&&stud[i].level==level)
{
pos=i;
break;
}
}
if(pos==-1)
{
printf("未找到相关事件!\n");
return;
}
for(i=pos;i<nSize-1;i++) //将需删除记录后的记录依次前移
{
tmp=stud[i];
stud[i]=stud[i+1];
stud[i+1]=tmp;
}
nSize--;
printf("成功删除事件!\n");
}
void save() //保存事件
{
int i;
FILE *fp;
fp=fopen("stud.txt","w");
for(i=0;i<nSize;i++)
{
fwrite(&stud[i],sizeof(struct event),1,fp);
}
fclose(fp);
printf("事件保存成功!\n");
}
void read() //读取事件
{
int i=0;
FILE *fp;
fp=fopen("stud.txt","r");
while(!feof(fp))
{
fread(&stud[i++],sizeof(struct event),1,fp);
}
nSize=i-1;
fclose(fp);
printf("事件读取成功!\n");
}
void main()
{
nSize=0;
while(1)
{
system("cls");
printf("***************************************************\n");
printf("**** 电子记事本 ****\n");
printf("**** 1.添加事件 2.查找事件 ****\n");
printf("**** 3.修改事件 4.删除事件 ****\n");
printf("**** 5.显示事件 6.退出程序 ****\n");
printf("**** 7.保存事件 8.读取事件 ****\n");
printf("***************************************************\n");
printf("请输入功能代码:\n");
scanf("%d",&mode);
while (mode8)
{
printf("输入的功能代码有误,请重新输入功能代码(1-8)\n");
scanf("%d",&mode);
}
switch(mode)
{
case 1:
newshijian();
break;
case 2:
searchshijian();
break;
case 3:
editshijian();
break;
case 4:
delshijian();
break;
case 5:
printshijian();
break;
case 6:
exit(0);
case 7:
save();
break;
case 8:
read();
break;
default:
printf("输入错误!\n");
break;
}
fflush(stdin); //清空输入缓存
getchar(); //停留,便于看清输出
}
}
while(stud[i].eventdate.day==day
&&stud[i].eventdate.month==month
&&stud[i].eventdate.year==year
&&stud[i].level==level);
这个要写在前面