第一次程设大作业:某科学的超会议议程管理系统(Scientific Meeting Management System)

2017-12-30 19:56:43来源:CSDN作者:w_weilan人点击

分享

项目概况

  • 项目名称:某科学的超会议议程管理系统(Scientific Meeting Management System)
  • 项目介绍:基于命令行,实现添加(add)、删除(delete)、修改(modify)、查询(query)等议程管理功能。

项目优点

基于栈结构的议程管理,十分高效

增加会议时只需加入栈顶,复杂度为O(1)。
删除/修改会议时,只需将该元素和栈顶元素交换,然后对栈顶元素进行操作,复杂度仍为O(1)。
清空栈时,只需将栈顶指针指向栈底而无需在数组中擦除数据,复杂度仍为O(1)。

基于相关定义的搜索

定义会议a和b相关,当且仅当满足下列条件之一:
- a和b同名
- a和b时间有重合部分,并且地点相同或有相同人员(换言之两场会议是否不能同时举行)

基于会议相关的定义,可以判断一个会议是否能够加入议程;也可以像下面一样进行高效严密的关键字查找。
例如:

  • 询问/删除/修改会议名为NAME的会议:搜索时仅需将key.name设置为”NAME”,其余设为-1。
  • 询问/删除/修改地点为ADDRESS的会议:将key.address设为”ADDRESS”,起止时间分别设成负正无穷,其余设为-1。
  • 询问/删除/修改含有参加人员PERSON的会议:将key.num_of_participants设为1,key.participants[0]设为”PERSON,起止时间分别设成负正无穷,其余设为-1。多人同理。
  • 询问/删除/修改含有以上多关键字的,可以类似地设置key。

代码模块化,接口全部使用文件流

所有模块化函数接口均使用文件流FILE*,为快速切换文件/屏幕IO提供很大便利。
与此相对应的,所有的IO均通过函数fscanf和fprintf实现。
所有的IO均写有提示,用户体验好。

项目缺点

搜索

虽然通过上面的相关定义实现了严谨好用的关键字搜索,但是实际使用还不够方便。增加几个函数进行辅助构造key即可,就没有实现了。

修改

由于会议管理系统使用了高效的栈结构进行存储,导致修改操作modify的后台实现是先将对应的元素删除再重新插入(只能修改栈顶元素)。

字符串

最初,读入名称、地址、人名都是用的是fgets函数整行读入,然而由整行读入带来了种种问题。
经过权衡,使用fscanf来读入字符串,缺陷是输入的字符串不可以有空格。

项目测试

同文件夹下log.txt文档中保存了用于测试的数据,运行结果均符合预期。

代码实现

meeting.h

  • define了一个常量MAXN,用来表示项目中所用数组的最大容量。暂定为128,实际使用时可根据需求修改MAXN的define并重新编译,十分方便。
  • 定义了一个结构体Meeting,用于描述一场会议,内容见下,意思明显,未加注释。其中,struct tm是c标准库<time.h>中定义的用于保存时间的结构体。
typedef struct{    int num_of_participants;    char name[MAXN],        address[MAXN],        participants[MAXN][MAXN];    struct tm begin,end;} Meeting;
  • 定义了Meeting的输入输出函数。参数中input表示读入流,output表示输出流。
    getMeeting函数从input中读入一个Meeting,并在output中输出提示信息。
    putMeeting函数将会议*m输出到output。
Meeting getMeeting(FILE *input,FILE *output);void putMeeting(FILE *output,const Meeting *m);
  • 定义了一个函数isRepel,用于判断传入的两场会议是否相关(其中还实现并使用了tm结构体的比较函数tmCmp):
int tmCmp(const struct tm *a,const struct tm *b);int isRepel(const Meeting *p,const Meeting *q);

main.h

选用栈结构用于存储会议,用数组和记录栈顶下标的变量实现。

int top=0;Meeting stack[MAXN];

main()函数通过调用以下几个模块函数实现。模块接口均相同,为两个参数input和output,表示从input中获得输入并将提示信息输出到output。
- 读入一个Meeting,若其与栈中存在的任意Meeting都不相关则将其放于栈顶。

void add(FILE *input,FILE *output);
  • 读入一个Meeting,删除栈中所有与之相关的Meeting。
void del(FILE *input,FILE *output);
  • 读入一个Meeting,修改栈中所有与之相关的Meeting。
void modify(FILE *input,FILE *output);
  • 读入一个Meeting,输出栈中所有与之相关的Meeting。
void query(FILE *input,FILE *output);
  • 从读入log.txt中的Meeting并通过add函数加入栈中。log.txt不存在时提示错误
void fin(FILE *input,FILE *output);
  • 将栈中的所有Meeting存入log.txt
void fout(FILE *input,FILE *output);
  • 清空栈中所有Meeting。
void clear(FILE *input,FILE *output);
  • 输出指令提示。
void help(FILE *input,FILE *output);

meeting.c

#ifndef MEETING_C_#define MEETING_C_#include<stdio.h>#include<string.h>#include<time.h>#define MAXN 128typedef struct{    int num_of_participants;    char name[MAXN],         address[MAXN],         participants[MAXN][MAXN];    struct tm begin,end;} Meeting;Meeting getMeeting(FILE *input,FILE *output){    Meeting tmp_m;    fprintf(output,"Input the Meeting name./n");    fscanf(input,"%s",tmp_m.name);    fprintf(output,"Input the Meeting address./n");    fscanf(input,"%s",tmp_m.address);    fprintf(output,"Input the begin time(year month day hour minute)./n");    fscanf(input,"%d%d%d%d%d",           &tmp_m.begin.tm_year,           &tmp_m.begin.tm_mon,           &tmp_m.begin.tm_mday,           &tmp_m.begin.tm_hour,           &tmp_m.begin.tm_min);    fprintf(output,"Input the end time(year month day hour minute)./n");    fscanf(input,"%d%d%d%d%d",           &tmp_m.end.tm_year,           &tmp_m.end.tm_mon,           &tmp_m.end.tm_mday,           &tmp_m.end.tm_hour,           &tmp_m.end.tm_min);    fprintf(output,"Input the number of participants./n");    fscanf(input,"%d",&tmp_m.num_of_participants);    for(int i=0; i<tmp_m.num_of_participants; ++i)    {        fprintf(output,"Input the name of participant %d./n",i);        fscanf(input,"%s",tmp_m.participants[i]);    }    return tmp_m;}void putMeeting(FILE *output,const Meeting *m){    fprintf(output,"%s %s/n%d %d %d %d %d/n%d %d %d %d %d/n%d",            m->name,            m->address,            m->begin.tm_year,            m->begin.tm_mon,            m->begin.tm_mday,            m->begin.tm_hour,            m->begin.tm_min,            m->end.tm_year,            m->end.tm_mon,            m->end.tm_mday,            m->end.tm_hour,            m->end.tm_min,            m->num_of_participants);    for(int j=0; j< m->num_of_participants; ++j)        fprintf(output," %s",m->participants[j]);    fprintf(output,"/n");}int tmCmp(const struct tm *a,const struct tm *b){    if(a->tm_year != b->tm_year)        return a->tm_year - b->tm_year;    if(a->tm_mon != b->tm_mon)        return a->tm_mon - b->tm_mon;    if(a->tm_mday != b->tm_mday)        return a->tm_mday - b->tm_mday;    if(a->tm_hour != b->tm_hour)        return a->tm_hour - b->tm_hour;    return a->tm_min - b->tm_min;}int isRepel(const Meeting *p,const Meeting *q){    if(!strcmp(p->name,q->name))        return 1;    if(tmCmp(&p->end,&q->begin)<0||tmCmp(&p->begin,&q->end)>0)        return 0;//时间不冲突    if(!strcmp(p->address,q->address))        return 1;    for(int i=0; i < p->num_of_participants; ++i)        for(int j=0; j < q->num_of_participants; ++j)            if(!strcmp(p->participants[i],q->participants[j]))                return 1;    return 0;}#endif

main.c

#include"meeting.c"int top=0;Meeting stack[MAXN];//all the fuctions get inputs from input,put outputs and hints to outputvoid add(FILE *input,FILE *output)//get a Meeting and push it to stack if possible{    stack[top]=getMeeting(input,output);    for(int i=0; i<top; ++i)        if(isRepel(&stack[top],&stack[i]))        {            fprintf(output,"Error: Repel with Meeting %s./n",stack[i].name);            return;        }    fprintf(output,"Add %s successfully./n",stack[top++].name);}void del(FILE *input,FILE *output)//get a key and delete all the Meetings related to it in stack{    fprintf(output,"Input the key(-1 for no key)./n");    Meeting key=getMeeting(input,output);    for(int i=0; i<top; ++i)        if(isRepel(&key,&stack[i]))        {            fprintf(output,"Delele %s successfully./n",stack[i].name);            stack[i--]=stack[--top];        }}void modify(FILE *input,FILE *output)//get a key and update all the Meetings related to it in stack{    int t_len=top;    del(input,output);    while(top<t_len)        add(input,output);}void query(FILE *input,FILE *output)//get a key and output all the Meetings related to it in stack{    fprintf(output,"Input the key(-1 for no key)./n");    Meeting key=getMeeting(input,output);    for(int i=0; i<top; ++i)        if(isRepel(&key,&stack[i]))        {            fprintf(output,"Find ");            putMeeting(output,&stack[i]);        }}void fin(FILE *input,FILE *output)//push all the meetings in 'log.txt' to stack if possible{    fprintf(output,"Start input from /'log.txt/'./n");    FILE *f=fopen("log.txt","r");    if(f==NULL)    {        fprintf(output,"Error:Do not find /'log.txt/'/n");        return;    }    int t_len;    fscanf(f,"%d",&t_len);    while(t_len--)        add(f,output);    fclose(f);    fprintf(output,"Input from /'log.txt/' successfully./n");}void fout(FILE *input,FILE *output)//output all the meetings from memory to 'log.txt'{    fprintf(output,"Start output to /'log.txt/'./n");    FILE *f=fopen("log.txt","w");    fprintf(f,"%d/n",top);    for(int i=0; i<top; ++i)        putMeeting(f,&stack[i]);    fclose(f);    fprintf(output,"Output to /'log.txt/' successfully./n");}void clear(FILE *input,FILE *output)//clear the stack{    top=0;    fprintf(output,"Clear successfully./n");}void help(FILE *input,FILE *output)//output the help information{    fprintf(output,"add : add a new meeting to memory if it does not repel./n");    fprintf(output,"delete : delete all the meetings which repel with the key./n");    fprintf(output,"modify : modify all the meetings which repel with the key./n");    fprintf(output,"fin : add new meetings from /'log.txt/' to memory if they do not repel./n");    fprintf(output,"fout : output all the meetings from memory to /'log.txt/'./n");    fprintf(output,"clear : clear all the meetings from memory./n");    fprintf(output,"help : get available instructions./n");    fprintf(output,"EOF(Ctrl+Z in Windows) : exit./n");}int main(){    FILE *input=stdin,*output=stdout;    fprintf(output,"Scientific Meeting Management System by WuK&LSY/n/n");    help(input,output);     fprintf(output,"/n");    for(char s[MAXN]; fscanf(input,"%s",s)!=EOF; fprintf(output,"/n"))    {        if(!strcmp(s,"add"))            add(input,output);        else if(!strcmp(s,"delete"))            del(input,output);        else if(!strcmp(s,"modify"))            modify(input,output);        else if(!strcmp(s,"query"))            query(input,output);        else if(!strcmp(s,"fin"))            fin(input,output);        else if(!strcmp(s,"fout"))            fout(input,output);        else if(!strcmp(s,"clear"))            clear(input,output);        else if(!strcmp(s,"help"))            help(input,output);        else fprintf(output,"/'%s/' is not an available instruction,and you can input /'help/' to get available instructions./n",s);    }}

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台