程序实践:电子备忘录

电子备忘录

1 系统的基本功能

利用电子备忘录记录未来某时间内的待办事宜。允许查询、添加。

2 要求

(1)备忘信息的保存方式自己设定,尽量保证操作灵活。一条备忘信息最多允许100个汉字。备忘信息的时间设置可以精确到具体的某个日期、或者某个日期中的某个时间段、或者某个日期中的某个具体时间。可以对事件的重复出现进行设置,如每月10号取工资,6月16号到28号每天上午9:10考试等。

(2)如果在添加时,该时段内已有安排则出现提示信息。

(3)查询时,如果当前日期有备忘信息,自动提醒。

(4)根据键盘输入的起始日期和终止日期,统计该时间段内的所有备忘信息并输出结果(包括时间和备忘信息);统计时按照时间的先后顺序进行排序。

好惨啊,写的太丑

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <string>
#include <ctime>
#include <fstream>
using namespace std;

int const MAXLEN = 10000;

struct E_Memorandum
{
    string begin_date;
    string end_date;
    string item;
    bool repeat;
}em[MAXLEN];

int item_num;

string get_to_year(string date)
{
    string ans = "";
    int len = date.length();
    for(int i = 0; i < len; i++)
    {
        if(date[i] != '/')
            ans += date[i];
        else
            break;
    }
    return ans;
}

string get_to_month(string date)
{
    string ans = "";
    int cnt = 0;
    int len = date.length();
    for(int i = 0; i < len; i++)
    {
        if(date[i] == '/')
            cnt ++;
        if(cnt == 2)
            break;
        ans += date[i];
    }
    return ans;
}

string get_to_day(string date)
{
    string ans = "";
    int cnt = 0;
    int len = date.length();
    for(int i = 0; i < len; i++)
    {
        if(date[i] == '/')
            cnt ++;
        if(cnt == 3)
            break;
        ans += date[i];
    }
    return ans;
}

string get_to_hour(string date)
{
    string ans = "";
    int cnt = 0;
    int len = date.length();
    for(int i = 0; i < len; i++)
    {
        if(date[i] == '/')
            cnt ++;
        if(cnt == 4)
            break;
        ans += date[i];
    }
    return ans;
}

string get_to_minute(string date)
{
    string ans = "";
    int cnt = 0;
    int len = date.length();
    for(int i = 0; i < len; i++)
    {
        if(date[i] == '/')
            cnt ++;
        if(cnt == 5)
            break;
        ans += date[i];
    }
    return ans;
}

bool is_leap(string y)
{
    int year = 0;
    int len = y.length();
    for(int i = 0; i < len; i++)
        year = year * 10 + (y[i] - '0');
    if((year % 400 == 0) || (year % 4 == 0 && year % 100))
        return true;
    return false;
}

int Convert(string date)
{
    int num = 0;
    int len = date.length();
    for(int i = 0; i < len; i++)
        num = num * 10 + (date[i] - '0');
    return num;
}

bool judge_input(string in)
{
    if(in == "notsure")
        return true;
    string year = get_to_year(in);
    int y = Convert(year);
    if(y != 0 && (y > 9999 || y < 1000))
    {
        cout << "error year (1000 - 9999)\n";
        return false;
    }
    string tmp = get_to_month(in), month = "", day = "", hour = "", minute = "";
    for(int i = 5; i < (int) tmp.length(); i++)
        month += tmp[i];
    int m = Convert(month);
    if(m != 0 && (m> 12 || m < 1))
    {
        cout << "error month (01 - 12)\n";
        return false;
    }
    tmp = get_to_day(in);
    for(int i = 8; i < (int) tmp.length(); i++)
        day += tmp[i];
    int d = Convert(day);
    if(d != 0)
    {
        if(m == 2)
        {
            if(is_leap(year) && d > 29)
            {
                cout << "error day (Leap yaer Feb only 29 days)\n";
                return false;
            }
            else if(!is_leap(year) && d > 28)
            {
                cout << "error day (no Leap yaer Feb only 28 days)\n";
                return false;
            }
        }
        else if((m == 1 || m == 3 || m == 5 || m == 7
            || m == 8 || m == 10 || m == 12) && d > 31)
        {
            cout << "error day (this month only 31 days)\n";
            return false;
        }
        else if((m == 4 || m == 6 || m == 9 || m == 11) && d > 30)
        {
            cout << "error day (this month only 30 days)\n";
            return false;
        }
        if(d < 1)
        {
            cout << "error day (must more than 01)\n";
            return false;
        }
    }
    tmp = get_to_hour(in);
    for(int i = 11; i < (int) tmp.length(); i++)
        hour += tmp[i];
    int h = Convert(hour);
    if(h != 0 && (h > 24 || h < 0))
    {
        cout << "error hour (00 - 24)\n";
        return false;
    }
    tmp = get_to_minute(in);
    for(int i = 16; i < (int) tmp.length(); i++)
        minute += tmp[i];
    int minu = Convert(minute);
    if(minu != 0 && (minu > 60 || minu < 1))
    {
        cout << "error minute (01 - 60)\n";
        return false;
    }
    return true;
}

void Add()
{
    string b_date, e_date, item;
    cout << "please input your item (formate: begin_date-end_date content)\n";
    cout << "if no end_date (formate: begin_date-notsure content)\n";
    cout << "date formate(Y/M/D/H/MIN)\n";
    bool flag = false;
    while(!flag)
    {
        flag = true;
        cout << "Input start time: ";
        cin >> b_date;
        while(!judge_input(b_date))
        {
            cout << "Input start time: ";
            cin >> b_date;
        }
        cout << "Input end time: ";
        cin >> e_date;
        while(!judge_input(e_date))
        {
            cout << "Input end time: ";
            cin >> e_date;
        }
        if(e_date <= b_date)
        {
            cout << "the end time should not ahead of begin time\n";
            flag = false;
        }
        for(int i = 0; i < item_num; i++)
        {
            if(em[i].begin_date <= b_date && em[i].end_date != "notsure" && em[i].end_date >= b_date)
            {
                cout << "begin time conflict\n";
                flag = false;
                break;
            }
            else if(em[i].begin_date <= e_date && em[i].end_date != "notsure" && em[i].end_date >= e_date)
            {
                cout << "end time conflict\n";
                flag = false;
                break;
            }
        }
    }
    cout << "Input the item: ";
    cin >> item;
    cout << "Whether repeat ?(Y/N) ";
    char tmp2[2] = "";
    while(tmp2[0] != 'Y' && tmp2[0] != 'N')
    {
        cin >> tmp2;
        if(tmp2[0] == 'Y')
        {
            em[item_num].repeat = true;
            break;
        }
        else if(tmp2[0] == 'N')
        {
            em[item_num].repeat = false;
            break;
        }
        else
            cout << "error input" << endl;
    }
    if(em[item_num].repeat)
    {
        if(em[item_num].begin_date.length() == 7)
        {
            string curb, cure;
            for(int i = 5; i < 7; i++)
                curb += em[item_num].begin_date;
            for(int i = 5; i < 7; i++)
                cure += em[item_num].end_date;
            char tmp[100];
            for(int i = 1000; i <= 9999; i++)
            {
                sprintf(tmp, "%d", i);
                em[item_num].begin_date += tmp;
                em[item_num].begin_date += "/";
                em[item_num].begin_date += curb;
                if(em[item_num].end_date != "notsure")
                {
                    em[item_num].begin_date += tmp;
                    em[item_num].begin_date += "/";
                    em[item_num].begin_date += cure;
                }
                else
                    em[item_num].end_date = e_date;
                em[item_num].item = item;
                em[item_num++].repeat = true;
            }
        }
        else if(em[item_num].begin_date.length() == 9)
        {
            string curb, cure;
            for(int i = 8; i < 10; i++)
                curb += em[item_num].begin_date;
            for(int i = 8; i < 10; i++)
                cure += em[item_num].end_date;
            for(int i = 1000; i <= 9999; i++)
            {
                char tmp[100];
                for(int j = 1; j <= 12; j++)
                {
                    char tmpp[100];
                    sprintf(tmp, "%d", i);
                    sprintf(tmpp, "%d", j);
                    em[item_num].begin_date += tmp;
                    if((int)strlen(tmpp) < 2)
                    {
                        tmpp[1] = tmpp[0];
                        tmpp[0] = '0';
                    }
                    em[item_num].begin_date += "/";
                    em[item_num].begin_date += tmpp;
                    em[item_num].begin_date += "/";
                    em[item_num].begin_date += curb;
                    if(em[item_num].end_date != "notsure")
                    {
                        em[item_num].begin_date += tmp;
                        if((int)strlen(tmpp) < 2)
                        {
                            tmpp[1] = tmpp[0];
                            tmpp[0] = '0';
                        }
                        em[item_num].begin_date += "/";
                        em[item_num].begin_date += tmpp;
                        em[item_num].begin_date += "/";
                        em[item_num].begin_date += cure;
                    }
                    else
                        em[item_num].end_date = e_date;
                    em[item_num].item = item;
                    em[item_num++].repeat = true;
                }
            }
        }
    }
    else
    {
        em[item_num].begin_date = b_date;
        em[item_num].end_date = e_date;
        em[item_num].item = item;
        item_num ++;
    }
    ofstream file;
    file.open("file.txt");
    file << item_num << endl;
    for(int i = 0; i < item_num; i++)
        file << em[i].begin_date << " " << em[i].end_date << " " << em[i].item << " " << em[i].repeat << endl;
    cout << "Add sucessfully\n";
    return;
}

bool cmp(E_Memorandum a, E_Memorandum b)
{
    int len1 = a.begin_date.length();
    int len2 = b.begin_date.length();
    if(len1 > len2)
        return a.begin_date < b.begin_date;
    if(len1 < len2)
        return a.begin_date > b.begin_date;
    if(len1 == len2)
    {
        if(a.begin_date != b.begin_date)
            return a.begin_date < b.begin_date;
        else
            return a.end_date < b.end_date;
    }
    return true;
}

void Output(int idx, bool flag)
{
    if(flag)
        cout << "Your have some item at now\n";
    if(em[idx].end_date != "notsure")
        cout << "date: " << em[idx].begin_date << " - " << em[idx].end_date << endl;
    else if(em[idx].end_date == "notsure")
        cout << "date: " << em[idx].begin_date << endl;
    cout << "item: " << em[idx].item << endl;
    return;
}

void Judge_no_end(int idx, string date, string now, bool &flag)
{
    if(date == now)
    {
        Output(idx, flag);
        flag = false;
    }
    return;
}

void Judge_has_end(int idx, string b_date, string e_date, string now, bool &flag)
{
    if(b_date <= now && now <= e_date)
    {
        Output(idx, flag);
        flag = false;
    }
    return;
}

void Query()
{
    bool find = false;
    time_t t = time(0);
    char tmp[100], get[100];
    memset(tmp, 0, sizeof(tmp));
    memset(get, 0, sizeof(get));
    strftime(tmp, sizeof(tmp), "%Y/%m/%d/%X",localtime(&t));
    int cnt = 0;
    for(int i = 0; i < (int) strlen(tmp); i++)
    {
        if(tmp[i] == ':')
            cnt++;
        if(cnt == 2)
            break;
        get[i] = tmp[i];
        if(tmp[i] == ':')
            get[i] = '/';
    }
    string now = get;
    string year = get_to_year(now);
    string month = get_to_month(now);
    string day =  get_to_day(now);
    string hour = get_to_hour(now);
    string minute = get_to_minute(now);
    bool flag = true;
    for(int i = 0; i < item_num; i++)
    {
        if(em[i].end_date == "notsure")
        {
            Judge_no_end(i, em[i].begin_date, minute, flag);
        }
        else
        {
            Judge_has_end(i, em[i].begin_date, em[i].end_date, minute, flag);
        }
    }
    if(!flag)
        find = true;

    sort(em, em + item_num, cmp);
    string b_date, e_date;
    cout << "Input the date that you want to query: (formate: Y/M/D/H/MIN)\n";
    cout << "Input start time: ";
    cin >> b_date;

    while(!judge_input(b_date))
    {
        cout << "Input start time: ";
        cin >> b_date;
    }
    cout << "Input end time: ";
    cin >> e_date;
    while(!judge_input(e_date))
    {
        cout << "Input end time: ";
        cin >> e_date;
    }
    while(e_date <= b_date)
    {
        cout << "the end time should not ahead of begin time\n";
        cout << "Input end time: ";
        cin >> e_date;
    }
    for(int i = 0; i < item_num; i++)
    {
        if(em[i].end_date == "notsure")
        {
            if(b_date <= em[i].begin_date && em[i].begin_date <= e_date)
            {
                Output(i, false);
                find = true;
            }
        }
        else
        {
            if(b_date <= em[i].begin_date && em[i].end_date <= e_date)
            {
                Output(i, false);
                find = true;
            }
        }
    }
    if(!find)
        cout << "There is no item in your query time\n";
}

int main()
{
    cout << "welcome to E_memorandum\n";
    char type[2];
    ifstream file;
    file.open("file.txt");
    file >> item_num;
    for(int i = 0; i < item_num; i++)
        file >> em[i].begin_date >> em[i].end_date >> em[i].item >> em[i].repeat;
    file.close();
    while(true)
    {
        cout << "please input your operation\n";
        cout << "press 1 to add\n";
        cout << "press 2 to query\n";
        cout << "press q to quit\n";
        cin >> type;
        if(type[0] != '1' && type[0] != '2' && type[0] != 'q')
        {
            cout << "Wrong input\n";
        }
        else if(type[0] == '1')
        {
            Add();
        }
        else if(type[0] == '2')
        {
            Query();
        }
        else
        {
            cout << "Thank for using\n";
            return 0;
        }
    }
}
时间: 2024-12-25 16:37:51

程序实践:电子备忘录的相关文章

程序实践:命令行之连连看

命令行之连连看 程序实践周课题,VC++6.0上可编译执行 游戏截图: #include <cstdio> #include <cstring> #include <iostream> #include <windows.h> #include <time.h> #include <algorithm> using namespace std; int dirx[4] = {1,-1,0,0}; int diry[4] = {0,0,

小程序实践(七):页面间传值

两种常用方式. 一.URL传值 看下官方API文档: 官方提供了5种页面间的跳转方式,其中前四种跳转的时候带有url参数,用于指定跳转的页面地址,而其中前三种url中可以带有参数. 以此来实现页面跳转时候的参数传值. 1.页面传基本数据格式的方式 将参数添加到url部分 以  ?属性名=属性值 的形式添加 , 多个参数用&连接 示例: 跳转前页面代码: 跳转后页面代码: 控制台信息: 2.页面传对象的方式  测试将对象作为参数传递的话,接受页面时接收不到值的.  解决办法就是先将对象转为Json

微信小程序实践 第一个项目

既然决定了解微信小程序开发,那么通过一个实际的项目来实践是最直接有效的.刚开始接触小程序,开发一个简单一点的小项目用来了解微信小程序在合适不过了. 项目名称:黑峰园 项目介绍:这是一个企业级的小程序,我准备参考他们网站,做一个类似网站一样展示类的小程序. 项目计划开始时间:2017年8月1日 项目计划结束时间:2017年8月3日 一个类似网站类的小程序用3天时间实际已经够多的了,主要是对小程序还不了解,所以需要提前做些准备工作.

基于NIO的Client/Server程序实践

转自    http://blog.csdn.net/zhangzhaokun/article/details/6612833 本意是想看明白Zookeeper内部的代码是怎么玩的,在琢磨一段时间之后,发现还是自己先独立写一个基于NIO的C/S模式程序,看看有哪些细微之处要注意,再来跟进ZK的细节比较靠谱一些,于是乎就自己练手写了如下这段代码 ,权当预热下使用NIO来编写网络程序这一知识点了,在这里记述这段代码的目的无非是加深下自己的印象,并且后续还可以有思索和改进的空间. 基本功能:服务器端不

使用Docker部署ASP.NET Core应用程序实践

前言 最近把很火的Docker给看了,于是就磨拳擦掌要去实践一下.于是就拿之前一个aps.net core的项目(已被停止)去练手.该项目之前在ubuntu14.04上确保可以正常运行,所以docker化应该不会有太多问题.搜索了下微软提供了asp.net core的官方docker镜像,但我为了学习docker决定从linux的基础镜像开始制作docker镜像,同时为了少绕弯路,决定从确保能运行的ubuntu14.04开始. 准备 环境 OS:Ubuntu 14.04 .NET Core SD

程序实践:C++概述

理论练习题 C++语言与C语言的本质差别是什么? [参考答案]:C++与C语言的本质差别就在于C++是面向对象的,而C语言是面向过程的. 面向过程的程序设计方法与面向对象的程序设计方法在对待数据和函数关系方面有什么不同? [参考答案]: 在面向过程的程序设计中,数据只被看成是一种静态的结构,它只有等待调用函数来对它进行处理. 在面向对象的程序设计中,将数据和对该数据进行合法操作的函数封装在一起作为一个类的定义:另外,封装还提供一种对数据访问严格控制的机制,因此,数据将被隐藏在封装体中,该封装体通

程序实践:C++流和文件流

理论练习题 试题一 编写一个程序,输入一个整数,分别以十进制.八进制和十六进制数值输出,输出十六进制值时限用大写字母. 解:对应的程序如下: #include <iostream.h> #include <iomanip.h> void main() {     int n;     cout << "输入一个整数:";     cin >> n;     cout << "十 进 制:" <<

程序实践系列(七)C++概述

理论练习题 C++语言与C语言的本质区别是什么? [參考答案]:C++与C语言的本质区别就在于C++是面向对象的.而C语言是面向过程的. 面向过程的程序设计方法与面向对象的程序设计方法在对待数据和函数关系方面有什么不同? [參考答案]: 在面向过程的程序设计中,数据仅仅被看成是一种静态的结构,它仅仅有等待调用函数来对它进行处理. 在面向对象的程序设计中.将数据和对该数据进行合法操作的函数封装在一起作为一个类的定义.另外.封装还提供一种对数据訪问严格控制的机制,因此.数据将被隐藏在封装体中,该封装

程序实践:接口与实现分离

我们将类定义和使用此类的客户代码分离,增强了软件的可复用性.而接口定义并标准化了人和系统等诸如此类事物彼此交互的方式.每个类定义包含了类的公有成员函数的完整定义及其私有数据成员声明.可是更好的软件工程是在类定义的外部定义成员函数,这样这些成员函数的实现细节对客户代码而言隐藏的,这种方式保证程序员不会写出依赖于类的实现细节的客户代码.否则,若类的实现更改,则客户代码将更可能"遭到损坏". GradeBook.h:使用函数原型定义类接口 // GradeBook.h GradeBook c