本次用纯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;
}