C++简单日程表系统——源码+实践报告书

这次课设刚好抽到了这个题目

自己断断续续写了四天

总算是把这个任务完成了

当然完成的也很一般,很多bug也没有修

今天交了作业了,所以打算把源码分享一下

如果要直接拿我的交作业的话我建议还是不要这么做

好好研究一下重新写我觉得比较ok

毕竟每个人写程序都有自己的习惯

别人的源码只是提供思路

要想有能力的成长还是自己老老实实敲比较好

下面是源代码,vs我不知道行不行,不过你可以直接拖进dev来编译

#include<iostream>//标准头文件
#include<string> //用string类方便一点 
#include<fstream> //文件读写需要用到 
#include<stdlib.h>//因为string转int类型用到了atoi函数 
#include<windows.h>//使用windows API来获取系统时间

//关于为什么不获取网络时间的问题 
//实在是我看不懂网上的代码
//也不想生搬硬套就只能退而求其次搞个简单点的 

using namespace std;
  
struct schedule{
  int date;
  int time;
  char event[100]; 
}a[99];//定义日程的结构体,最大支持100条的输入 

void write_array_to_file(){
  
  string filename;
  cout<<"请输入你想保存的文件名,例如:data"<<endl;
  cin>>filename;
  
  system("cls");
  
  ofstream fout(filename.c_str());
  
  int i;
  
  for(i=0;a[i].date != 0;i++){
    fout<<a[i].date<<endl;		
  }
  
  for(i=0;a[i].date != 0;i++){
    fout<<a[i].time<<endl;		
  }
  
  
  for(i=0;a[i].date != 0;i++){
    fout<<a[i].event<<endl;		
  }
  
  fout.close();
  
  cout<<"添加成功"<<endl; 
   
}//写入数据到文件的函数 

void rewrite_array_to_file(){
  
  string filename;
  cout<<"请输入你想保存的文件名" <<endl; 
  cout<<"输入已有文件将会覆盖,例如:data"<<endl;
  cin>>filename;
  
  system("cls");
  
  ofstream fout(filename.c_str());
  
  int i;
  
  for(i=0;a[i].date != 0;i++){
    fout<<a[i].date<<endl;		
  }
  
  for(i=0;a[i].date != 0;i++){
    fout<<a[i].time<<endl;		
  }
  
  
  for(i=0;a[i].date != 0;i++){
    fout<<a[i].event<<endl;		
  }
  
  fout.close();
   
}//重新写入数据到文件的函数 

void readfile_to_array(int number,string filename){
  
  ifstream fin(filename.c_str());
  
  string data;
  
  int i=0;
  int j=0;
  int k=number/3;
  int l=0;
    
  while(j<k){
    getline(fin,data);
    a[i].date = atoi(data.c_str());
    j++;
    i++;
  }
  
  k=k+k;
  i=0;
  
  while(j<k){
    getline(fin,data);
    a[i].time = atoi(data.c_str());
    j++;
    i++;
  }
  
  k=number;
  i=0; 
  
  while(j<k){
    getline(fin,data);
    for(l=0;l<data.length();l++){
      a[i].event[l] = data[l];
    }
    j++;
    i++;
  }
  //这边没有用类型转换
  //string的数据要放进char[]可以直接循环
  //然后一个字符一个字符的放进去 
  
  //for(i=0;i<number/3;i++){
  //	cout<<a[i].date<<a[i].time<<a[i].event<<endl;
  //}
  //测试代码,为了确认能不能正确输出的 
  
  //!fin.eof()是直接读取到结尾,这里因为分层录入
  //所以没有这么搞而是读取行数来分层 
  
  fin.close();
  
}//读取文件中数据到数组的函数

void readfile_linenumber(){
  
  string filename;
  cout<<"请输入你已经保存的文件名,例如:data"<<endl;
  cin>>filename;
  
  system("cls");
  
  ifstream fin(filename.c_str());
  cout<<"读取文件"<<filename<<"中"<<endl;
  
  system("cls");
  
  int n=0;
  string data;
  
  while(getline(fin,data)){
    n++;
  }
  fin.close();
  
  cout<<"  检测到已知的"<<n/3<<"条记录"<<endl; 
  cout<<endl;

  readfile_to_array(n,filename);
  
}//读取文件的行数来帮助把文件中的数据提取到结构体 

int linenumber(){
  
  system("cls");
  
  string filename;
  cout<<"请再次确认你的文件名,例如:data"<<endl;
  cin>>filename;
  
  system("cls");
  
  ifstream fin(filename.c_str());
  
  int n=0;
  string data;
  
  while(getline(fin,data)){
    n++;
  }
  
  return n;
  
}//提取文件行数,这个我本来是没写的,但是发现后面查询需要 

void add(){
  
  int i=0;
  int j=0;
  int m=0;
  int year;
  int mouth;
  int day;
  int hour;
  int minutes;
  char choose;
  
  while(j<100){
    
    if(a[j].date != 0){
      i=i+1;
      j++;
    }else{
      j++;
    }

  }
  
  while(i<100){
    
    system("cls");
    reenterdate:
    cout<<"请输入日期,格式如:20200701"<<endl;
    cin>>a[i].date;
    year=a[i].date/10000;
    mouth=(a[i].date%10000)/100;
    day=(a[i].date%10000)%100;
    if(year>0 && year<10000 && mouth>0 && mouth<13 && day>0 && day<32){
    }else{
      cout<<"输入格式有误或日期不合理"<<endl;
      cout<<"请重新输入"<<endl; 
      goto reenterdate;
    }
    system("cls");
    cout<<"请输入时间,格式如:1200"<<endl;	
    cin>>a[i].time;
    hour=a[i].time/100;
    minutes=a[i].time%100;
    if(hour>=0 && hour<25 && minutes>=0 && minutes<61){
    }else{
      cout<<"输入格式有误或日期不合理"<<endl;
      cout<<"请重新输入"<<endl; 
      goto reenterdate;
    }
    if(i!=0){
      while(m<i){
        if(a[m].date == a[i].date && a[m].time == a[i].time ){
          cout<<"该时间段已经有事件安排"<<endl;
          cout<<"请重新输入"<<endl;
          goto reenterdate; 
        }else{
          m++;
        }
      }		
    } 

    system("cls");
    cout<<"请输入事件,限制字数50以内"<<endl;
    cin>>a[i].event; 	
    system("cls");
    
    cout<<"请问是否还要继续添加(Y/N)"<<endl;

    cin>>choose;
    
    if(choose=='Y'){
      i++;
      continue;
    } else if(choose=='N'){
      break;
    }
      
  }
  
}//添加日程信息的函数 

void search_and_del(){
  
  del:
  
  system("cls");
  
  int i;
  char choose;
  int dateuse;
  int timeuse;
  
  cout<<"你想查询的日期是?例如:20200701" <<endl; 
  cin>>dateuse;
  cout<<"你想查询的时间是?例如:1300"<<endl; 
  cin>>timeuse;
  
  system("cls");
  
  for(i=0;i<100;i++){
    if(a[i].date == dateuse && a[i].time == timeuse){
      cout<<"该日期和时间下的时间安排是"<<a[i].event<<endl;
      cout<<"请问是否要删除呢?(Y/N)"<<endl; 
      cin>>choose;
      if(choose=='Y'){
        while(i<100){
          a[i]=a[i+1];
          i++;
        }
        rewrite_array_to_file();
      } else if(choose=='N'){
        cout<<"是否回到主界面(Y/N)"<<endl;
        cin>>choose;
    
        if(choose=='Y'){
          break;
        } else if(choose=='N'){
          goto del;
        } 
        
      }
    }
  }
  
}//检索并删除日程信息 

void get_time_and_compare(){
      
  SYSTEMTIME sys; 
    GetLocalTime( &sys ); 
    
    int dateget;
    int timeget;
    int i=0;
    int number;
    
    dateget = sys.wYear*10000+sys.wMonth*100+sys.wDay;
  timeget = sys.wHour*100+sys.wMinute;
  
  number = linenumber()/3;
  
  system("cls");
  cout<<"目前查询到日程表里有一下信息,日程// 代表已经是过去时"<<endl; 

  while(i<number){

    if(a[i].date == dateget && a[i].time<timeget){
      
      cout<<a[i].date<<a[i].time<<a[i].event<<"//"<<endl;
      
    }else if(a[i].date == dateget && a[i].time>timeget){
      
      cout<<a[i].date<<a[i].time<<a[i].event<<endl;
        
    }
    
    i++;
    
  }
      
}//获取时间并且对当日发生的事件进行检索 

int remind_time_select(int rday,int rmin){
  
  if(rday==0){
    return rmin;
  }else if(rmin==0){
    return rday;
  }
  
} //提前提醒时间的选择

int get_date(){
  
  SYSTEMTIME sys; 
    GetLocalTime( &sys ); 
    
    int dateget;
    
    dateget = sys.wYear*10000+sys.wMonth*100+sys.wDay;
    
    return dateget;
  
}//把日期传给主函数 

int get_time(){
  
  SYSTEMTIME sys; 
    GetLocalTime( &sys ); 	
  
  int timeget;
  
  timeget = sys.wHour*100+sys.wMinute;
  
  return timeget;
  
}//把时间传给 主函数 

int main(){
   
  
  cout<<"加载已保存文件"<<endl; 
  
  readfile_linenumber();

  start://程序开头预留标签,方便之后跳转 
  
  //主界面
  cout<<"  日程表管理"<<endl;
  cout<<endl;
  cout<<"1.添加日程信息"<<endl;
  cout<<"2.删除日程信息"<<endl;
  cout<<"3.查询"<<endl;
  cout<<"4.设置"<<endl;
  cout<<"0.退出"<<endl; 
  
  //主函数的变量区 
  int i;//选择和循环 
  cin>>i;
  char choose;//选择 
  int rday;//用户定义的提醒天数 
  int rmin;//用户定义的提醒时间 
  int limit;//提醒时间的实际变量 
  int number;//文件行数 
  int dateget;//系统日期 
  int timeget;//系统时间 
  int compare1;//比较变量1 
  int compare2;//比较变量 2 
  
  switch(i){
    
    case 1:{
      system("cls");
      add();
      write_array_to_file();
      cout<<"是否回到主界面(Y/N)"<<endl;
      cin>>choose;
    
      if(choose=='Y'){
        break;
      } else if(choose=='N'){
        return 0;
      } 
      
    }
      
    case 2:
      search_and_del();
      cout<<"是否回到主界面(Y/N)"<<endl;
      cin>>choose;
    
      if(choose=='Y'){
        break;
      } else if(choose=='N'){
        return 0;
      }
      
    case 3:
      system("cls");
      cout<<"请问你要查询什么呢?"<<endl;
      cout<<"Y.提前提醒事件"<<endl;
      cout<<"N.当日事件"<<endl;
      cin>>choose;
    
      if(choose=='Y'){
        
        number=linenumber()/3;
        cout<<"提醒事件如下"<<endl;
        
        if(limit>0 && limit<=7){
              
          for(i=0;i<number;i++){
            
            dateget=get_date();
            
            compare1=a[i].date-dateget;
            
            if( compare1>0 && compare1<=limit ){
              
              cout<<a[i].event<<endl; 
              
            }
            
          }
          
        }else if(limit>10 && limit<1440){
          
          dateget=get_date();
          timeget=get_time();
          
          for(i=0;i<number;i++){
            
            compare1=a[i].date-dateget;
            compare2=(a[i].time/100)*60+(a[i].time%100)-(timeget/100)*60+(timeget%100);
            
            if(compare2>0 && compare2<=limit && compare1 == 0){
              
              cout<<a[i].event<<endl; 
              
            }
            
          }
          
        }else{
          
          cout<<"你还没有设置提前提醒的范围"<<endl;
          cout<<"或者没有可以提醒的事件"<<endl;
          cout<<"请返回到主菜单设置"<<endl; 
          
        }
              
      } else if(choose=='N'){
        get_time_and_compare();
      }
      
      cout<<"是否回到主界面(Y/N)"<<endl;
      cin>>choose;
    
      if(choose=='Y'){
        break;
      } else if(choose=='N'){
        return 0;
      }
      
    case 4:
      system("cls");
      cout<<"设置"<<endl;
      cout<<"Y.设置提醒时间"<<endl;
      cout<<"N.待添加"<<endl;
      
      cin>>choose;
            
      if(choose=='Y'){
        
        system("cls");
        cout<<"请指定天数,最大不可超过7日"<<endl;
        cout<<"PS:有什么事是必须提前超过一星期提醒的啊"<<endl;
        cout<<"直接指定分钟数的话直接输入0"<<endl; 
        
        enterrday:
        
        cin>>rday;
        
        if(rday<=7&&rday>0){
          system("cls");
          cout<<"好的,我记下了"<<endl;
          cout<<rday<<"天内的事件将会出现在提醒事件中" <<endl;
          limit = remind_time_select(rday,0);
        }else if(rday==0){
          system("cls");
          cout<<"由于规避bug的原因所以必须大于10分钟小于1440分钟"<<endl; 
          cout<<"PS:其实是因为我太懒了,懒得写那么细了"<<endl;
          cin>>rmin;
          system("cls");
          cout<<"好的,我记下了"<<endl;
          cout<<rmin<<"分钟内的事件将会出现在提醒事件中" <<endl;	
          limit = remind_time_select(0,rmin);	
        }else{
          system("cls");
          cout<<"你输入的数字不行啊,请重新输入"<<endl;
          goto enterrday;	
        }
        
      } else if(choose=='N'){
        system("cls");				
        cout<<"我已经连新功能都懒得写了"<<endl;
        cout<<"不要想着能有啥彩蛋了"<<endl; 
      }
      
      cout<<"是否回到主界面(Y/N)"<<endl;
      cin>>choose;
    
      if(choose=='Y'){
        break;
      } else if(choose=='N'){
        return 0;
      }
      
    case 0:
      return 0;
  }	
  
  system("cls");
  goto start;
  
  return 0;
}

《C++简单日程表系统——源码+实践报告书》有1个想法

  1. //空白是因为图片太长了
    //对不起老师麻烦你滚轮多滚两下
    //word我也不是很会用
    //所以排版看起来很成问题
    //给您添麻烦了
    //真的对不起
    (滑稽

发表评论

您的电子邮箱地址不会被公开。