怎样用C语言去实现一个日程管理系统

本次用纯C语言设计一个机器人管理系统

可以实现的功能如下:

① 插入一个事件安排,包括事件的时期、具体时间(时分秒)、事件内容 (用一个结构体实现)
② 对所有的事件进行一个按时间的先后排序
③ 删除一个事件,按照时间或者事件内容删除(两种删除都要实现)
④ 查找具体事件具体要被完成的事件
⑤ 修改一个事件的具体时间
⑥ 到点提醒,到确切的时间点后,提醒张三该去做那件事情(获取系统当前时间即可)

涉及到的知识点:

① 链表的各种操作
② 结构体
③ 排序
④ 线程

 

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define CONTENT_LENGTH 100

typedef struct event{
	int year;
	int month;
	int day;
	int hour;
	int minute;
	int second;
	char content[CONTENT_LENGTH];
	struct event *next;
}Event;


//初始化链表
Event* init(){
	Event *eHead = (Event*)malloc(sizeof(Event));
	eHead->next=NULL;
	if(eHead!=NULL){
		return eHead;
	}
	else{
		printf("空间分配失败!");
		exit(1);
	}
}

//打印事件具体时间
void printInfo(Event *Ev){

	printf("日期: %04d/%02d/%02d 时间: %02d:%02d:%02d 事件:%s\n",Ev->year,Ev->month,Ev->day,Ev->hour,Ev->minute,Ev->second,Ev->content);
}


//输入新的事件 总是从尾端插入
Event* insert(Event *eHead){
	for(;eHead->next!=NULL;eHead=eHead->next);
	Event *test=(Event*)malloc(sizeof(Event));
	test->next=NULL;
	printf("请输入日期:yyyy/mm/dd(例如:2018/01/09)\n");
	scanf("%d %*c %d %*c %d",&test->year,&test->month,&test->day);
	printf("请输入具体时间:hh:MM:ss(例如:23:01:00)\n");
	scanf("%d %*c %d %*c %d",&test->hour,&test->minute,&test->second);
	fflush(stdin);
	printf("请输入事件内容(最长为50个字符):\n");
	gets(test->content);
	printf("事件已成功保存!\n");
	eHead->next=test;
}


//比较两事件的时间先后
int compare(Event *a,Event *b){
	//将Int格式化为str,直接比较字符串的大小
	char str_a[100]={0};
	sprintf(str_a,"%d04%02d%02d%02d%02d%02d",a->year,a->month,a->day,a->hour,a->minute,a->second);
	char str_b[100]={0};
	sprintf(str_b,"%d04%02d%02d%02d%02d%02d",b->year,b->month,b->day,b->hour,b->minute,b->second);
	int n=strcmp(str_a,str_b);
	if(n>0){
		return 1;
	}
	else{
		return 0;
	}
}


//排序
Event* sort(Event *L){
	Event *p, *q, *next;
	int temp;

	for( p = L->next; p->next != NULL; p = p->next )    /*每次循环都找出一个最小值,将最小值交换到第一位,然后将指针向后移动一位*/
	{
		next = p;
		for( q = p->next; q; q = q->next )    /*由前向后遍历,找出最小的节点*/
		{
			if( compare(next,q)==1 )
				next = q;
		}
		if( next != p )
		{
				temp = p->year;
				p->year = next->year;
				next->year = temp;

				temp = p->month;
				p->month = next->month;
				next->month = temp;

				temp = p->day;
				p->day = next->day;
				next->day = temp;

				temp = p->hour;
				p->hour = next->hour;
				next->hour = temp;

				temp = p->minute;
				p->minute = next->minute;
				next->minute = temp;

				temp = p->second;
				p->second = next->second;
				next->second = temp;

				char tem[CONTENT_LENGTH];
				memcpy(tem,p->content,100);
				memcpy(p->content,next->content,100);
				memcpy(next->content,tem,100);
		}
	}
	printf("排序成功!\n");
	return L;
}


// 通过具体日期查找事件
void findByDate(Event *head){
	int year;
	int month;
	int day;
	int hour;
	int minute;
	int second;
	printf("请输入日期:yyyy/mm/dd(例如:2018/01/09)\n");
	scanf("%d %*c %d %*c %d",&year,&month,&day);
	printf("请输入具体时间:hh:MM:ss(例如:23:01:00)\n");
	scanf("%d %*c %d %*c %d",&hour,&minute,&second);
	printf("查找中...");
	for(head=head->next;head!=NULL;head=head->next){
		if(head->day==day && head->hour==hour && head->minute==minute && head->month==month && head->second==second && head->year==year){
			printf("已找到:\n");
			printInfo(head);
			break;
		}
	}
	if(head==NULL){
		printf("未找到该事件\n");
	}
}


//通过事件内容查找事件
void findByEventContent(Event *head){
	char temp[CONTENT_LENGTH];
	printf("请输入您要查找事件内容:\n");
	gets(temp);
	printf("查找中...");
	for(head=head->next;head!=NULL;head=head->next){
		if(strcmp(temp,head->content)==0){
			printf("已找到:\n");
			printInfo(head);
			break;
		}
	}
	if(head==NULL){
		printf("未找到该事件\n");
	}
}


//通过日期删除事件
void deleteByDate(Event *head){
	Event *before,*cur;
	int year;
	int month;
	int day;
	int hour;
	int minute;
	int second;

	printf("请输入日期:yyyy/mm/dd(例如:2018/01/09)\n");
	scanf("%d %*c %d %*c %d",&year,&month,&day);
	printf("请输入具体时间:hh:MM:ss(例如:23:01:00)\n");
	scanf("%d %*c %d %*c %d",&hour,&minute,&second);
	for(before=head,cur=head->next;cur!=NULL;cur=cur->next,before=before->next){
		if(cur->day==day && cur->hour==hour && cur->minute==minute && cur->month==month && cur->second==second && cur->year==year){
			before->next=cur->next;
			printf("删除成功\n");
			break;
		}
	}
	if(cur==NULL){
		printf("未找到该事件\n");
	}

}


//通过事件内容删除事件
void deleteByContent(Event *head){
	Event *before,*cur;
	char temp[CONTENT_LENGTH];
	printf("请输入事件内容:\n");
	gets(temp);
	for(before=head,cur=head->next;cur!=NULL;before=before->next,cur=cur->next){
		if(strcmp(temp,cur->content)==0){
			before->next=cur->next;
			printf("删除成功\n");
			break;
		}
	}
	if(cur==NULL){
		printf("未找到该事件\n");
	}
}


//修改事件时间
void modifyDate(Event *head){
	char temp[CONTENT_LENGTH];
	printf("请输入您要查找事件内容:\n");
	gets(temp);
	printf("查找中...");
	for(head=head->next;head!=NULL;head=head->next){
		if(strcmp(temp,head->content)==0){
			printf("已找到:\n");
			printInfo(head);
			break;
		}
	}
	if(head==NULL){
		printf("未找到该事件\n");
		return;
	}
	int year;
	int month;
	int day;
	int hour;
	int minute;
	int second;
	printf("进行修改:");
	printf("请输入日期:yyyy/mm/dd(例如:2018/01/09)\n");
	scanf("%d %*c %d %*c %d",&year,&month,&day);
	printf("请输入具体时间:hh:MM:ss(例如:23:01:00)\n");
	scanf("%d %*c %d %*c %d",&hour,&minute,&second);
	head->year=year;
	head->month=month;
	head->day=day;
	head->hour=hour;
	head->minute=minute;
	head->second=second;
	printf("修改完成\n");

}


//遍历链表
void travel(Event *head){
	head=head->next;
	while(head!=NULL){
		printInfo(head);
		head=head->next;
	}
}

//查找的子菜单,分为 1 遍历 2时间查找 3 事件查找
void find(Event *head){
	char decide = 'y';                          //定义while变量,函数是否继续进行
	int num;                                  //定义switch变量,函数跳转到哪个子函数
	while (decide != 'n')
	{
		printf("  ***************************************************\n");
		printf("  ****  1  遍历  2 时间查找   3 事件查找  4 退出 ****\n");
		printf("  ***************************************************\n");
		scanf("%d", &num);
		fflush(stdin);
		switch (num)
		{
		case 1:
			travel(head);
			break;
		case 2:
			findByDate(head);
			break;
		case 3:
			findByEventContent(head);
			break;
		default:
			decide = 'n';
			break;
		}
	}
}


//储存链表信息
void dataSave(Event *head)    //系统的存储函数,由主函数调用
{
	FILE *fp;
	char filename[10];
	printf("请输入存储文件名(包括物理地址)\n");
	scanf("%s",filename);
	Event *p = (Event *)malloc(sizeof(Event));
	p = head->next;
	if ( (fp=fopen(filename, "w"))== NULL)
	{
		printf("cannot open file");
		return;
	}
	printf("input data:\n");
	while (p != NULL)
	{
		fwrite(p, sizeof(Event), 1, fp); /* 成块写入文件*/
		p = p->next;
	}
	fclose(fp);
}


//删除事件的子菜单,分为 1 时间查找删除 2事件查找删除
void eventDelete(Event *head){
	char decide = 'y';                          //定义while变量,函数是否继续进行
	int num;                                  //定义switch变量,函数跳转到哪个子函数
	while (decide != 'n')
	{
		printf("  ***************************************************\n");
		printf("  **** 	   1 时间查找   2 事件查找  3 退出  	 ****\n");
		printf("  ***************************************************\n");
		scanf("%d", &num);
		fflush(stdin);
		switch (num)
		{
		case 1:
			deleteByDate(head);
			break;
		case 2:
			deleteByContent(head);
			break;
		default:
			decide = 'n';
			break;
		}
	}
}


// 提醒有无即将需要完成的事件
void alert(Event *head){
	time_t t;
    struct tm * lt;
    time (&t);//获取Unix时间戳。
    lt = localtime (&t);//转为时间结构。
    printf("当前时间为:");
    printf ( "%d/%d/%d %d:%d:%d\n",lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果
	int flag=0;
	for(head=head->next;head!=NULL;head=head->next){
		if(head->day==lt->tm_mday && head->hour==lt->tm_hour  && head->month==lt->tm_mon+1 && head->year==lt->tm_year+1900){
			printf("你现在该完成 %s \n",head->content);
			flag=1;
		}
	}
	if(flag==0){
		printf("你现在没有要完成的事件\n");
	}

}


//菜单列表
void menu(){
	char decide = 'y';                          //定义while变量,函数是否继续进行
	int num = 1;                                //定义switch变量,函数跳转到哪个子函数
	Event *head;                                //定义链表的头指针
	head = init();                              //给头指针开辟空间
	head->next = NULL;                          //初始化头指针

	while (decide != 'n')
	{
	    printf("  ***************************************************\n");
        printf("  **********        波比日程管理系统         ********\n");
		printf("  ***************************************************\n");
		printf("  **********  1 输入  2 查找  3 修改  4 提醒 ********\n");
		printf("  **********  5 删除  6 存储  7 排序  8 退出 ********\n");
		printf("  ***************************************************\n");
		scanf("%d", &num);
		fflush(stdin);
		switch (num)
		{
		case 1:
			insert(head);
			break;
		case 2:
			find(head);
			break;
		case 3:
			modifyDate(head);
			break;
		case 4:
			alert(head);
			break;
		case 5:
			eventDelete(head);
			break;
		case 6:
			dataSave(head);
			break;
		case 7:
			head=sort(head);
			break;
		default:
			decide = 'n';
			break;
		}

	};
}



int main(){
	menu();
	return 0;
}

 

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值